C++ 值已更改(常量Qstring&;)为空时未在qspinbox中激发

C++ 值已更改(常量Qstring&;)为空时未在qspinbox中激发,c++,qt,qspinbox,qt5.12,C++,Qt,Qspinbox,Qt5.12,我在QTreeWidget中有一个QSpinbox,方法与这里描述的组合框类似 我在这里读到,如果您使用valueChanged(const QString&)信号,当您将数字退格为空时,将触发该信号。然而,我的情况并非如此。我能看到的那篇文章和我的代码之间的唯一区别是我使用的是QSpinBox而不是QDoubleSpinBox,但我想这不应该是问题所在 我想我可能是错误地连接了信号,因为我得到的行为与我期望的valueChanged(int)行为完全匹配。但是我不知道怎么写连接。有人看到错误了

我在QTreeWidget中有一个QSpinbox,方法与这里描述的组合框类似

我在这里读到,如果您使用
valueChanged(const QString&)
信号,当您将数字退格为空时,将触发该信号。然而,我的情况并非如此。我能看到的那篇文章和我的代码之间的唯一区别是我使用的是QSpinBox而不是QDoubleSpinBox,但我想这不应该是问题所在

我想我可能是错误地连接了信号,因为我得到的行为与我期望的valueChanged(int)行为完全匹配。但是我不知道怎么写连接。有人看到错误了吗

我的代码是: QTreeWidgetItemSpinBox.h

#pragma一次
#pragma警告(推送)
#杂注警告(禁用:26451 26495 26498 26439)
#包括
#包括
#包括
#布拉格警告(pop)
类QTreeWidgetItemSpinBox:
公共密码箱
{
Q_对象
公众:
QTreeWidgetItemSpinBox(QTreeWidgetItem*treeItem,int列);
公众时段:
void validateValue(常量QString和输入);
私人:
QTreeWidgetItem*treeItem;
int列;
};
QTreeWidgetItemSpinBox.cpp

#包括“QTreeWidgetItemSpinBox.h”
#包括
QTreeWidgetItemSpinBox::QTreeWidgetItemSpinBox(QTreeWidgetItem*treeItem,int列)
:treeItem(treeItem),column(column)
{
连接(此、信号(值已更改(常量QString&))、插槽(validateValue(常量QString&));
}
void QTreeWidgetItemSpinBox::validateValue(常量QString和输入)
{

qDebug()我不知道为什么Qt论坛帖子说,当值为空时,会发出
QDoubleSpinBox::valueChanged(const QString&)
,因为它不是空的(无论如何从Qt 5.12开始).两个版本的信号都是从中的同一个位置连续发出的。可能与以前的版本不同。
QSpinBox
的情况相同。我想原因是,由于该值无效,它实际上没有改变(例如,如果此时失去焦点/完成编辑,它将自动恢复到上一个已知的良好值…因此该值实际上没有改变)


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

使用正确的信号尝试Qt5连接语法
connect(this,&QSpinBox::valueChanged,&QTreeWidgetItemSpinBox::validateValue);
实际上是
连接(this,QOverload::of(&QSpinBox::valueChanged),&QTreeWidgetItemSpinBox::validateValue);
但是连接的方式不会有任何区别。@MaximPaperno“连接的方式不会有任何区别”那么,为什么在语法上会有差异呢?为什么一个会比另一个更受欢迎?你能给我连接的代码吗?因为我是如何做到的,我得到了错误“没有这样的信号”好的,连接并不困难,但我只是有一段时间没有说出来。对于其他有相同问题的人,连接看起来是这样的:
QLineEdit*lineEdit=QAbstractSpinBox::lineEdit();connect(lineEdit,&QLineEdit::textChanged,this,&QTreeWidgetItemSpinBox::validateValue);