我在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
}
我不确定为什么Qt论坛帖子说当值为空时发出QDoubleSpinBox::valueChanged(const QString &)
,因为它不是(无论如何从Qt 5.12开始(。两个版本的信号都是从代码中的同一位置连续发出的。 也许在以前的版本中有所不同。QSpinBox
也一样。 我想原因是由于该值无效,它实际上并没有改变(因为例如,如果您当时失去焦点/完成编辑,它将自动恢复到最后一个已知的良好值......所以值实际上并没有改变(。
你可以连接到QLineEdit
(用QAbstractSpinBox::lineEdit()
获得(textChanged()
(或textEdited()
(信号,以获得编辑器的实际值。