QLineEdit with QValidator:无论输入有效性如何,对编辑完成做出反应?

QLineEdit with QValidator: React to editing finished regardless of input validity?

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

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

这样做的原因:我想使用 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
        });
    }
};

我觉得你真的不需要subclass QLineEdit.

clean 方法在没有 Acceptable input, is to override QValidator and provide an implementation for fixup(). From the docs 时更改 QLineEdit 值:

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, you can subclass it and provide an implementation for fixup(), as it does not have one, see here

class 应该看起来像这样:

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