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 , &QSpinBox::valueChanged , &QTreeWidgetItemSpinBox::validateValue);
其实应该是connect(this , QOverload<const QString &>::of(&QSpinBox::valueChanged), &QTreeWidgetItemSpinBox::validateValue);
但是连接的方式不会有任何区别。
@MaximPaperno “如何建立连接不会有任何区别”那么为什么语法会有所不同?为什么一个比另一个更受欢迎?
wiki.qt.io/New_Signal_Slot_Syntax
【参考方案1】:
我不确定为什么 Qt 论坛帖子说 QDoubleSpinBox::valueChanged(const QString &)
在值为空白时发出,因为它不是(从 Qt 5.12 开始)。这两个版本的信号都是从the code 的同一个地方连续发出的。也许在以前的版本中有所不同。 QSpinBox
也一样。我想原因是由于该值无效,它实际上并没有改变(因为例如,如果你失去焦点/完成编辑,它会自动恢复到最后一个已知的好值......所以值没有'实际上没有改变)。
您可以改为连接到QLineEdit
(通过QAbstractSpinBox::lineEdit()
获得)textChanged()
(或textEdited()
)信号以获取编辑器的实际值。
【讨论】:
你能给我连接的代码吗,因为我是怎么做的?我收到错误“没有这样的信号” 好的,连接并不困难,但我只是有一段时间没有说出来。对于其他有同样问题的人,连接看起来像这样:QLineEdit* lineEdit = QAbstractSpinBox::lineEdit(); connect(lineEdit, &QLineEdit::textChanged,this, &QTreeWidgetItemSpinBox::validateValue);
以上是关于valueChanged(const Qstring &) 为空时不会在 qspinbox 中触发的主要内容,如果未能解决你的问题,请参考以下文章
GattCharacteristic.ValueChanged 停止被调用
UIPageControl 没有在 valueChanged 上调用选择器
设置 RadDatePicker 日期而不触发 ValueChanged
当通过鼠标更改值时,JList 会触发 valueChanged 两次
为 UISlider 的 valueChanged 更新 UITableView titleForFooterInSection?