2016-10-11 4 views
2

У меня есть QComboBox с валидатора, связанные с ним:Как проверить, является ли значение виджета «приемлемым»?

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

Этот виджет подключается к слоту, который запускается на выполнение, когда введенное значение изменяется (currentTextChanged()).

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

В этой конфигурации onTextChanged() выполняется, когда валидатор возвращает Acceptable или Intermediate. Как я могу выполнить слот только тогда, когда введенное значение действительно действительно (Acceptable). Или, альтернативно, как проверить состояние проверки в слоте onTextChanged()? (Как ни странно, я заметил, что cb->validator(), кажется, всегда возвращают nullptr.)

+0

«Я заметил, что le-> validator() см. ms всегда возвращать nullptr "le или cb? Вы также можете сохранить указатель валидатора в переменной-члене. –

+0

@FrankOsterfeld Вопрос исправлен! – mimo

+0

Попробуйте установить родительский элемент 'QDoubleValidator' в' QComboBox cb' вместо 'this'. – RedX

ответ

1

Присоединить новый валидатор к вашему выпадающий список:

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

Подключите сигнал/слот:

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

В слот, начните проверку, если текущий текст действителен:

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

Не существует способа получить доступ к валидатору из экземпляра '' QComboBox''? – mimo

+0

Да, http://doc.qt.io/qt-4.8/qcombobox.html#validator См. Последние изменения – mohabouje

+0

Но, как я упоминал в вопросе, '' validator() '' возвращает мне нулевой указатель. Фактически, он делает это не только в слоте, но также когда я проверяю его сразу после установки валидатора с помощью '' cb-> setValidator (новый QDoubleValidator (0.0, 100.0, 2, this)); '. – mimo