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())信号以获取编辑器的实际值。