2016-10-11 2 views
2

Ich habe einen QComboBox mit einem Validator zugeordnet:Wie überprüft man, ob der Widget-Wert "Acceptable" ist?

QComboBox* cb = new QComboBox; 
// ... 
cb->setValidator(new QDoubleValidator(0.0, 100.0, 2, this)); 

diesem Widget einen Schlitz verbunden ist, dass der eingegebene Wert ausgeführt wird, wenn geändert (currentTextChanged()).

connect(cb, SIGNAL(currentTextChanged(QString)), 
     this, SLOT(onTextChanged(QString))); 

In dieser Konfiguration ausgeführt die onTextChanged() wird, wenn der Validator Acceptable oder Intermediate zurückgibt. Wie kann ich den Slot nur ausführen, wenn der eingegebene Wert wirklich gültig ist (Acceptable). Oder alternativ, wie kann ich den Validierungsstatus im onTextChanged() Slot überprüfen? (Seltsamerweise habe ich festgestellt, dass cb->validator() scheint immer eine nullptr zurückzukehren.)

+0

"Ich habe festgestellt, dass le-> validator() sieht ms, um immer ein nullptr "le oder cb zurückzugeben? Sie können den Validatorzeiger auch in einer Membervariablen beibehalten. –

+0

@FrankOsterfeld Frage behoben! – mimo

+0

Versuchen Sie, das übergeordnete Element von 'QDoubleValidator' auf' QComboBox cb' anstelle von 'this' zu setzen. – RedX

Antwort

1

einen neuen Validator Ihre Combobox Attach:

QComboBox* cb = new QComboBox; 
QDoubleValidator* validator = new QDoubleValidator(0.0, 100.0, 2, this); 
cb->setValidator(validator); 

Schließen Sie Ihr Signal/Slot:

connect(cb, SIGNAL(currentTextChanged(QString)), 
     this, SLOT(onTextChanged(QString))); 

In der Steckplatz, starten durch Prüfen ob der aktuelle Text gültig ist:

int pos = cb->currentIndex(); 
const QDoubleValidator* validator = qobject_cast<const QDoubleValidator*>(cb->validator()); 
QValidator::State state = validator->validate(txt, pos); 
if (state != QValidator::Acceptable) 
    return; 
+0

Gibt es keine Möglichkeit, über die '' QComboBox''-Instanz auf den Validator zuzugreifen? – mimo

+0

Ja, http://doc.qt.io/qt-4.8/qcombobox.html#validator Siehe die letzten Änderungen – mohabouje

+0

Aber, wie ich in der Frage erwähnt habe, gibt 'validator()' 'mir einen Nullzeiger zurück. Tatsächlich tut es das nicht nur im Slot, sondern auch, wenn ich es direkt nach dem Setzen des Validators mit 'cb-> setValidator (new QDoubleValidator (0.0, 100.0, 2, dies));' 'überprüfe. – mimo

Verwandte Themen