0

我在 QTreeWidget 中有一个 QSpinbox,其方法类似于此处描述的组合框方法https://stackoverflow.com/a/4849010/10220019

我在这里读过https://forum.qt.io/topic/103667/qdoublespinbox-why-isn-t-valuechanged-signal-fired-when-content-is-empty/5如果你使用valueChanged(const QString&)信号,这应该当您从数字退格为空时触发。然而,这对我来说不是这样。我可以看到该帖子和我的代码之间的唯一区别是我使用的是 QSpinBox 而不是 QDoubleSpinBox 但我猜这不应该是问题。

我想我可能错误地连接了信号,因为我得到的行为完全符合我对 valueChanged(int) 的期望。但是那时我不知道如何编写连接。有人看到错误吗?

我的代码是:QTreeWidgetItemSpinBox.h

#pragma once

#pragma warning (push)
#pragma warning (disable: 26451 26495 26498 26439)
#include <QtWidgets/QSpinbox>
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QToolTip>
#pragma warning (pop)

class QTreeWidgetItemSpinBox :
    public QSpinBox
{
    Q_OBJECT

public:
    QTreeWidgetItemSpinBox(QTreeWidgetItem* treeItem, int column);

public slots:
    void validateValue(const QString& input);

private:
    QTreeWidgetItem* treeItem;
    int column;
};

QTreeWidgetItemSpinBox.cpp

#include "QTreeWidgetItemSpinBox.h"
#include <QtCore/QDebug>

QTreeWidgetItemSpinBox::QTreeWidgetItemSpinBox(QTreeWidgetItem* treeItem, int column)
    : treeItem(treeItem), column(column)
{
    connect(this, SIGNAL(valueChanged(const QString&)), SLOT(validateValue(const QString&)));
}

void QTreeWidgetItemSpinBox::validateValue(const QString& input)
{
    qDebug() << "Called"; //Is called when changed to another number but not if the change is to empty or if I add zeros before a number
}
4

1 回答 1

0

我不确定为什么QDoubleSpinBox::valueChanged(const QString &)当值为空白时会发出 Qt 论坛帖子,因为它不是(从 Qt 5.12 开始)。两个版本的信号都是从代码中的同一位置连续发出的。也许在以前的版本中有所不同。对QSpinBox. 我想原因是由于该值无效,它实际上并没有改变(因为例如,如果你失去焦点/完成编辑,它会自动恢复到最后一个已知的好值......所以值没有'实际上没有改变)。

您可以改为连接到QLineEdit(通过QAbstractSpinBox::lineEdit()) textChanged()(或textEdited()) 信号来获取编辑器的实际值。

于 2019-09-08T00:06:09.043 回答