valueChanged(const Qstring &) 为空时未在 qspinbox 中触发
valueChanged(const Qstring &) not fired in qspinbox when empty
我在 QTreeWidget 中有一个 QSpinbox,其方法类似于此处描述的组合框方法 。
我在这里 https://forum.qt.io/topic/103667/qdoublespinbox-why-isn-t-valuechanged-signal-fired-when-content-is-empty/5 读到,如果您使用 valueChanged(const QString&)
信号,当您从数字退格为空时,这应该会触发。但是,对我来说情况并非如此。我能看到 post 和我的代码之间的唯一区别是我使用 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 论坛 post 说 QDoubleSpinBox::valueChanged(const QString &)
在值为空时发出,因为它不是(无论如何从 Qt 5.12 开始)。两个版本的信号都是从 the code 中的同一个地方连续发出的。也许它在以前的版本中有所不同。 QSpinBox
也一样。我想原因是因为该值无效,它实际上并没有改变(因为例如,如果你失去 focus/finish 编辑,它将自动恢复到最后一个已知的正确值......所以值实际上并没有改变)。
您可以改为连接到 QLineEdit
(通过 QAbstractSpinBox::lineEdit()
获得)textChanged()
(或 textEdited()
)信号以获取编辑器的实际值。
我在 QTreeWidget 中有一个 QSpinbox,其方法类似于此处描述的组合框方法 。
我在这里 https://forum.qt.io/topic/103667/qdoublespinbox-why-isn-t-valuechanged-signal-fired-when-content-is-empty/5 读到,如果您使用 valueChanged(const QString&)
信号,当您从数字退格为空时,这应该会触发。但是,对我来说情况并非如此。我能看到 post 和我的代码之间的唯一区别是我使用 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 论坛 post 说 QDoubleSpinBox::valueChanged(const QString &)
在值为空时发出,因为它不是(无论如何从 Qt 5.12 开始)。两个版本的信号都是从 the code 中的同一个地方连续发出的。也许它在以前的版本中有所不同。 QSpinBox
也一样。我想原因是因为该值无效,它实际上并没有改变(因为例如,如果你失去 focus/finish 编辑,它将自动恢复到最后一个已知的正确值......所以值实际上并没有改变)。
您可以改为连接到 QLineEdit
(通过 QAbstractSpinBox::lineEdit()
获得)textChanged()
(或 textEdited()
)信号以获取编辑器的实际值。