QLineEdit with QValidator:不管输入的有效性如何,对编辑完成做出反应
QLineEdit with QValidator: React to editing finished regardless of input validity?
QLineEdit
有一个信号QLineEdit::editingFinished
,当用户完成编辑时发出,例如按enter键。但是,如果设置了验证器或输入掩码,则仅在输入有效时才发出editingFinished
。
但是,不管输入的有效性如何,当用户完成编辑时,我该如何反应呢?我是否必须手动检查输入,返回,小部件失去焦点等?
这样做的原因是:我想创建一个使用QDoubleValidator
编辑数字的自定义小部件。当用户完成编辑并且输入无效时(错误的范围,空文本,…)我想把它重置为有效的默认值。像这样:
class NumberEdit: public QLineEdit
{
public:
NumberEdit(double min, double max)
{
setValidator(new QDoubleValidator(min, max, 10));
setText(QString::number(min));
connect(this, /* this is the problem */, [this, min]() {
if(!hasAcceptableInput())
setText(QString::number(min)); // Reset to valid number
});
}
};
我不认为你真的需要子类化QLineEdit
。
QLineEdit
值,当它没有Acceptable
输入,是覆盖QValidator
,并提供fixup()
的实现。来自文档:
fixup()
是为可以修复一些用户错误的验证器提供的。默认实现什么都不做。例如,QLineEdit
将会如果用户按Enter(或Return)键,则调用fixup()
目前无效。这给fixup()
函数提供了机会用魔法把Invalid
变成Acceptable
。
因为你正在使用QDoubleValidator
,你可以子类化它并提供fixup()
的实现,因为它没有,见这里。
这个类看起来应该是这样的:
class MyDoubleValidator : public QDoubleValidator{
public:
explicit MyDoubleValidator(QObject* parent= nullptr)
:QDoubleValidator(parent){}
MyDoubleValidator(double bottom, double top, int decimals, QObject* parent=nullptr)
:QDoubleValidator(bottom, top, decimals, parent){}
virtual void fixup(QString& input)const override{
input= QString::number(bottom(), 'f', decimals());
}
};
这样,您就可以像这样使用任何QLineEdit
的验证器:
lineEdit->setValidator(new MyDoubleValidator(100, 200, 2, lineEdit));
注意,这样lineEdit
将在每次编辑后发出editingFinished()
。因为即使QLineEdit
的内容不是Acceptable
,我们的fixup()
实现也总是将内容固定为Acceptable
。
相关文章:
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 编辑文件中的文本
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- SetDlgItemInt 不会更改嵌入资源的编辑框
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- C++,Qt:仅在双击后编辑qtablewidget项目
- 编辑字符串以包含括号 c++ 之间的变量
- Arduino函数无法编辑数组
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- "未定义对'WinMain@16'的引用"gcc 编辑器中的错误
- C++MFC编辑框处理双击
- 是否可以使用指针访问变量以避免直接编辑变量?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 在 c++ 中编辑注册表项
- 无法将行编辑中的文本打印到 Qt C++ 中的标签
- 尝试使用 CMake 和 MinGW64 进行构建时出现多个编辑错误
- 如何从C++而不是虚幻编辑器中添加静态网格体组件的值?
- UE4 - Visual Studio在我从编辑器添加新的c ++文件后无法打开任何源文件 - UBT_COMPILED
- Qt如何将行编辑连接到进度条
- QLineEdit with QValidator:不管输入的有效性如何,对编辑完成做出反应