gpt4 book ai didi

c++ - QLineEdit 与 QValidator : React to editing finished regardless of input validity?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:02 27 4
gpt4 key购买 nike

QLineEdit 有一个信号 QLineEdit::editingFinished 当用户完成编辑时发出,例如按回车键。但是,如果设置了验证器或输入掩码,则只有在输入有效时才会发出 editingFinished

但是无论输入的有效性如何,我如何对用户完成编辑使用react?我是否必须手动检查输入、返回、小部件失去焦点等?

这样做的原因:我想使用 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 时,clean 方法可以更改它输入,是重写QValidator 并为fixup() 提供一个实现.来自docs :

fixup() is provided for validators that can repair some user errors. The default implementation does nothing. QLineEdit, for example, will call fixup() if the user presses Enter (or Return) and the content is not currently valid. This allows the fixup() function the opportunity of performing some magic to make an Invalid string Acceptable.

由于您使用的是 QDoubleValidator ,您可以将它子类化并为 fixup() 提供一个实现,因为它没有一个,参见 here .

这个类看起来应该是这样的:

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() 实现也会始终修复内容成为可接受的

关于c++ - QLineEdit 与 QValidator : React to editing finished regardless of input validity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39552126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com