QLineEdit具有一个信号QLineEdit::editingFinished,当用户完成编辑(例如,按Enter键)时会发出该信号。但是,如果设置了验证器或输入掩码,则只有在输入有效时才发出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值的干净方法是覆盖QValidator并提供 fixup() 的实现。从docs:



由于您正在使用 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()实现也总是将内容固定为Acceptable

10-04 12:33
查看更多