带QValidator的QLineEdit:无论输入有效性如何,都对编辑完成了反应?

时间:2016-09-17 22:01:10

标签: c++ qt qlineedit qvalidator

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
        });
    }
};

1 个答案:

答案 0 :(得分:7)

我认为你真的不需要继承QLineEdit

clean 在没有Acceptable输入时更改QLineEdit值的方法是覆盖QValidator并为{{提供实现3}}。来自fixup()

  

fixup()是为可以修复某些用户错误的验证程序提供的。   默认实现什么都不做。例如,QLineEdit会   如果用户按下Enter(或Return)并且内容为,则调用fixup()   目前无效。这允许fixup()函数有机会   执行一些魔术来制作Invalid字符串Acceptable

由于您使用的是docs,因此可以对其进行子类化并为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()); } }; ,请参阅QDoubleValidator

该课程应如下所示:

QLineEdit

这样,您可以将验证器与任何lineEdit->setValidator(new MyDoubleValidator(100, 200, 2, lineEdit)); 一起使用,如下所示:

lineEdit

请注意,这种方式QLineEdit会在每次修改后发出here。因为即使Acceptable的内容不是fixup(),我们的Acceptable实施也始终修复内容为{{1}}。