valueChanged(const Qstring &) 为空时不会在 qspinbox 中触发

Posted

技术标签:

【中文标题】valueChanged(const Qstring &) 为空时不会在 qspinbox 中触发【英文标题】:valueChanged(const Qstring &) not fired in qspinbox when empty 【发布时间】:2019-09-06 13:25:49 【问题描述】:

我在 QTreeWidget 中有一个 QSpinbox,其方法类似于此处描述的组合框 https://***.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&)signal,当你从一个数字退格到空时,它应该会触发。然而,这对我来说不是这样。我可以看到该帖子和我的代码之间的唯一区别是我使用的是 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 5 连接语法connect(this , &amp;QSpinBox::valueChanged , &amp;QTreeWidgetItemSpinBox::validateValue); 其实应该是connect(this , QOverload&lt;const QString &amp;&gt;::of(&amp;QSpinBox::valueChanged), &amp;QTreeWidgetItemSpinBox::validateValue); 但是连接的方式不会有任何区别。 @MaximPaperno “如何建立连接不会有任何区别”那么为什么语法会有所不同?为什么一个比另一个更受欢迎? wiki.qt.io/New_Signal_Slot_Syntax 【参考方案1】:

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

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

【讨论】:

你能给我连接的代码吗,因为我是怎么做的?我收到错误“没有这样的信号” 好的,连接并不困难,但我只是有一段时间没有说出来。对于其他有同样问题的人,连接看起来像这样:QLineEdit* lineEdit = QAbstractSpinBox::lineEdit(); connect(lineEdit, &amp;QLineEdit::textChanged,this, &amp;QTreeWidgetItemSpinBox::validateValue);

以上是关于valueChanged(const Qstring &) 为空时不会在 qspinbox 中触发的主要内容,如果未能解决你的问题,请参考以下文章

GattCharacteristic.ValueChanged 停止被调用

UIPageControl 没有在 valueChanged 上调用选择器

设置 RadDatePicker 日期而不触发 ValueChanged

当通过鼠标更改值时,JList 会触发 valueChanged 两次

为 UISlider 的 valueChanged 更新 UITableView titleForFooterInSection?

Flutter:不清楚 ValueChanged 和 FutureBuilder