11

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

1 に答える 1

10

本当にサブクラス化する必要はないと思いますQLineEdit

入力がない場合に値を変更する明確な方法、オーバーライドしての実装を提供することです。ドキュメントから:QLineEditAcceptableQValidatorfixup()

fixup()一部のユーザーエラーを修復できるバリデーター用に提供されています。デフォルトの実装は何もしません。QLineEditたとえば、fixup()ユーザーが Enter (または Return) を押してコンテンツが現在有効でない場合に呼び出されます。これにより、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));

この方法lineEditeditingFinished()、編集のたびに発行されることに注意してください。の内容QLineEditが でなかったとしてもAcceptable、私たちのfixup()実装は常に内容を に修正Acceptableします。

于 2016-09-18T14:49:11.797 に答える