DoubleValidator überprüft die Bereiche nicht richtig

DoubleValidator überprüft die Bereiche nicht richtig


Lassen Sie mich das Problem anhand eines Beispiels erklären.


Wenn wir einen TextField haben so,


TextField {
text: "0.0"
validator: DoubleValidator { bottom: -359.9;
top: 359.9;
decimals: 1;
notation: DoubleValidator.StandardNotation }
onEditingFinished: {
console.log("I'm here!");
}
}

Wir können Zahlen wie 444.9 eingeben , 399.9 oder -555.5 . Wie Sie sehen, liegen die Werte nicht zwischen -359.9 und 359.9 .


In der Dokumentation finden wir die folgenden Informationen:



Ich dachte DoubleValidator hat so etwas nicht akzeptiert, tut es aber leider.


Ich nehme an, die Lösung wäre, die endgültige Eingabe zu überprüfen, aber wir haben wieder ein Problem:editingFinished wird nur ausgegeben, wenn der Validator einen akzeptablen Zustand zurückgibt und dies nicht immer der Fall ist.


Vielleicht mache ich keinen guten Ansatz, ich verstehe nicht, wie man DoubleValidator verwendet oder vielleicht brauche ich Code in C++.


Ich arbeite übrigens mit Qt 5.4.


Antworten:


Das Problem liegt in der Tatsache, dass QML TextField intermediate akzeptiert Eingabe:



Die validate() -Funktion von QDoubleValidator beschreibt, wann QValidator::Intermediate zurückgegeben wird :



Das heißt, der Validator gibt QValidator::Intermediate zurück , solange ein doppelter Wert eingegeben wird und da TextField mit "intermediate" einverstanden ist, können Sie alles eingeben, solange es eine Zahl ist.


Sie können QDoubleValidator ableiten und um validate() zu überschreiben , sodass Intermediate nicht zurückgegeben wird wenn die Werte außerhalb der Grenzen liegen:


class TextFieldDoubleValidator : public QDoubleValidator {
public:
TextFieldDoubleValidator (QObject * parent = 0) : QDoubleValidator(parent) {}
TextFieldDoubleValidator (double bottom, double top, int decimals, QObject * parent) :
QDoubleValidator(bottom, top, decimals, parent) {}
QValidator::State validate(QString & s, int & pos) const {
if (s.isEmpty() || (s.startsWith("-") && s.length() == 1)) {
// allow empty field or standalone minus sign
return QValidator::Intermediate;
}
// check length of decimal places
QChar point = locale().decimalPoint();
if(s.indexOf(point) != -1) {
int lengthDecimals = s.length() - s.indexOf(point) - 1;
if (lengthDecimals > decimals()) {
return QValidator::Invalid;
}
}
// check range of value
bool isNumber;
double value = locale().toDouble(s, &isNumber);
if (isNumber && bottom() <= value && value <= top()) {
return QValidator::Acceptable;
}
return QValidator::Invalid;
}
};