LINUX.ORG.RU

Что-то не пойму как использовать QValidator совместно с QComboBox

 , , qvalidator


0

1

Имею такой код:

#define MINIMUM_ALLOWED_FONT_SIZE 5
#define MAXIMUM_ALLOWED_FONT_SIZE 99

QComboBox fontSize;
...
fontSize.addItem("-",0);
for(int i=MINIMUM_ALLOWED_FONT_SIZE; i<=MAXIMUM_ALLOWED_FONT_SIZE; ++i)
    fontSize.addItem(QString("%1").arg(i),i);

fontSize.setEditable(true);
QValidator *fontsizeValidator = new QIntValidator(MINIMUM_ALLOWED_FONT_SIZE, MAXIMUM_ALLOWED_FONT_SIZE, this);
fontSize.setValidator(fontsizeValidator);

По идее, в таком комбо-боксе не должна быть возможность:

- выбрать первый пункт "-"
- написать что-то отличное от чисел 5-99

На деле можно выбрать и "-", и написать любые символы, например буквы.

Вопрос: как, блин работает этот валидатор?

★★★★★

Чтобы закрыть оба условия нужно использовать QRegularExpressionValidator, тк можно установить только 1 валидатор. Чтобы выполнить валидацию нужно вызвать validate

CrazyAlex25 ★★★
()
Ответ на: комментарий от CrazyAlex25

Чтобы выполнить валидацию нужно вызвать validate

У какого объекта и в какой момент?

Xintrea ★★★★★
() автор топика

Вопрос: как, блин работает этот валидатор?

Ответ: а он не работает с QComboBox.

Я проверил на QLineEdit - прекрасно работает. Достаточно просто установить валидатор через setValidator(). Никаких вызово validate не нужно.

Но с QComboBox, в котором хоть включено редактирование через setEditable, хоть не включено, данный валидатор не работает и позволяет выбирать из списка любые значения, и вводить вручную любые значения. Что он есть, что его нет - толку никакого.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ответ: а он не работает с QComboBox

Это у тебя не работает. У других работает.

Но с QComboBox, в котором хоть включено редактирование через setEditable, хоть не включено, данный валидатор не работает и позволяет выбирать из списка любые значения, и вводить вручную любые значения. Что он есть, что его нет - толку никакого.

А у меня была такая же проблема и я её решил. Но у меня чуть по-другому было, мне нужно было и числа и допустимые слова. Наследуешься от QValidator, переопределяешь метод validate() и всё работает. Единственное, стоит помнить, что валидатор исчезает, если играешься со свойством editable:

Note: The validator is removed when the editable property becomes false.

UVV ★★★★★
()
Ответ на: комментарий от UVV

The validator is removed when the editable property becomes false.

Ну у меня вначале editable становится true, а потом подключается валидатор. Так что на это грешить не могу.


Наследуешься от QValidator, переопределяешь метод validate() и всё работает.

Вопрос был в том, почему не работает готовый валидатор QIntValidator.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от UVV

Если валидатор «исчезает», почему бы не отнаследоваться от комбобокса, ловить слотом изменение значения и валидировать тем же или очень похожим куском кода из метода validate()?

deep-purple ★★★★★
()
Ответ на: комментарий от Xintrea

А почему ты решил захардкодить что 5-99 хватит всем? Валидируй от 1 до уинт макс. Или на фонтметрику ориентируйся, шрехты же разные бывают.

deep-purple ★★★★★
()
Ответ на: комментарий от UVV

Наследуешься от QValidator, переопределяешь метод validate() и всё работает.

Так и сделал. Внутри метода validate() сделал отладочный вывод.

Результат: при выборе значения в QComboBox (или его редактировании), вызывается validate(). Но! Даже если он возвращает QValidator::Invalid, то значение из списка все равно выбирается, и любое значение вводится.

Похоже, нужно городить свой ComboBox.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Если валидатор «исчезает», почему бы не отнаследоваться от комбобокса, ловить слотом изменение значения и валидировать

Ну видимо так и придется сделать.

Валидатор не исчезает и даже работает. А вот его значения игнорируются комбобоксом, вот в чем загвоздка.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

А еще про 5-99 захардкодить — если от 1 до макс уинт, то можно вообще будет не использовать комбобокс, вместо него взять спинбокс.

Проверить код сейчас не могу — я не на той машине где преферанс и поэтессы.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от Xintrea

В такой конфигурации не работает, согласен. Вот так сделай:

ui->comboBox->completer()->setCompletionMode(QCompleter::PopupCompletion);

UVV ★★★★★
()
Ответ на: комментарий от UVV

Хм, все равно не работает.

ui->comboBox->setEditable(true);
ui->comboBox->completer()->setCompletionMode(QCompleter::PopupCompletion);
ui->comboBox->setValidator(fontsizeValidator);

Выбирает любое значение, позволяет ввести что угодно. Не пойму почему у тебя работает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от UVV

Кстати, стандартное значение:

The default value is QCompleter::PopupCompletion

То которое ты и выставляешь. Но я попробовал все:

QCompleter::PopupCompletion
QCompleter::InlineCompletion
QCompleter::UnfilteredPopupCompletion

Ни с одним ограничение не работает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Короче единственный случай фейла, который я нашёл, это если выбрать 1, то потом позволяет ввести буквы, сейчас покумекаю, почему. В остальных случаях всё работает.

Версия Qt какая?

UVV ★★★★★
()
Ответ на: комментарий от UVV

У тебя какой Qt и Линух/битность?

Мой: Debian 9 Stable 64 bit, Qt 5.10.1

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от UVV

Ан нет, таки не работает. Смотри. У тебя сам валидатор некорректный. Что там конкретно не так, я сейчас разбираться не буду, времени нет.

Я вернул твои закомментированные строки с QIntValidator, и поставил наместо мой добавленный QCompleter. Теперь всё работает. Проверь =)

UVV ★★★★★
()
Ответ на: комментарий от Xintrea
QValidator *fontsizeValidator = new QIntValidator(5, 99, this);
ui->comboBox->setEditable(true);
ui->comboBox->completer()->setCompletionMode(QCompleter::PopupCompletion);
ui->comboBox->setValidator(fontsizeValidator);

Кстати, за отсутствие пробелов с обеих сторон от сравнительных операторов и знака = я бы отправил тебя исправлять код.

UVV ★★★★★
()
Последнее исправление: UVV (всего исправлений: 2)
Ответ на: комментарий от UVV

Не знаю, что ты считаешь работающим, но у меня и в Linux на Qt 5.10.1 и в Windows на Qt 5.4.2 с этим валидатором можно выбрать и 1 и 150. И везде где не диапазон 5-99 можно вводить любую чушь.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ну так 150 - это твоё значение, которое ты сам подставил в ComboBox. Или я чего не понимаю?

Опять же, та же проблема, что если ты выберешь 150, то после числа буквы всё ещё разрешают ввести. Сам продебаж и расскажи, в чём проблема.

У меня тоже 5.10.1 на линуксе.

UVV ★★★★★
()
Ответ на: комментарий от UVV

Ну так 150 - это твоё значение, которое ты сам подставил в ComboBox. Или я чего не понимаю?

Да, но валидатор должен позволять выбирать только 5-99, в этом же суть валидатора.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Я либо не понимаю твою логику, либо то, что ты хочешь сделать. Если тебе нужно 5-99, то нах тебе комбобокс? Возьми line editor и ёбни туда QRegExpValidator. Если тебе нужно 5-99 плюс твои какие-то предопределённые значения (1, 150), то вроде бы всё работает (за исключением моего вышеназыванного случая)

UVV ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.