Проверка в QSpinBox

я имею QSpinBox который должен принимать только нечетные числа, поэтому я установил начальное значение 3 и шаг 2.

QSpinBox* spinBox = new QSpinBox;
spinBox->setValue(3);
spinBox->setSingleStep(2);

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

Так можно ли установить валидацию, которая отвечает моим требованиям без наследования QSpinBox и переопределить его validate метод?

Мое текущее решение проверяет в слоте, является ли значение нечетным:

void MyWidget::slotSetSpinBoxValue(int value)
{
if(value%2 != 0)
{
//call function which takes only odd values
}
else
{
//here I want to show some kind off message that value can only be odd
//call function with --value parameter
}
}

Второй вопрос, как показать некоторые советы для QSpinBox? Я хотел бы показать подсказку, как подсказка отображается с сообщением, что QSpinBox значение должно быть нечетным. я обнаружил statusTip недвижимость в QWidget но не могу найти пример, как его использовать.

1

Решение

Ну, вы можете сделать обходной путь, используя valueChanged() слот:

void MainWindow::on_spinBox_valueChanged(int arg1)
{
if( arg1 % 2 == 0)
{
//for even values, show a message
QMessageBox b;
b.setText("Only odd values allowed!");
b.exec();
//and then decrease the value to make it odd
ui.spinBox->setValue( arg1 - 1 );
}
}

Теперь, если вы хотите сохранить старое значение в случае, если используемый вводит четное число, вам придется либо наследовать от QSpinBoxили используйте фильтр событий, чтобы поймать события нажатия клавиш, и действовать до значение меняется.

Чтобы отобразить сообщение, когда пользователь наводит указатель мыши на спин-бокс, вам необходимо установить поле toolTip, который содержит строку, которая будет показана:

spinbox с подсказкой

ОБНОВИТЬ:
Если вам не нужно окно сообщения, вы можете:

  • использование QStatusBar, Он может отображать сообщения, которые длятся только некоторое время (что вы его передаете). Недостатком является то, что сообщение будет отображаться на панели в нижней части окна, а не рядом с спинбоксом.
  • Поместите ярлык под спинбокс. Установите для текста метки что-то вроде «разрешены только нечетные значения», когда пользователь вводит недопустимое значение, и установите пустую строку, когда пользователь вводит правильное значение. Вы также можете сделать это динамически:
    1. Пользователь вводит неправильное значение
    2. Создать QLabel с текстом предупреждения и установите Qt::WA_DeleteOnClose флажок, поэтому ярлык будет удален при закрытии.
    3. Создать QTimer с singleShotи включите его через пару секунд (когда вы хотите, чтобы сообщение исчезло)
    4. Подключите сигнал таймера к метке close() слот. Когда таймер истечет, ярлык закроется, и, благодаря WA_DeleteOnClose, будут удалены.
0

Другие решения

Что касается комментария Ричарда, я думаю, что ctrl-> setKeyboardTracking (false) обошел бы проверку, которая в противном случае происходила бы при каждом нажатии клавиши, и позволил бы валидации только в конце.

1

Я думаю, что правильный ответ не работает идеально. Это делает невозможным ввод значений, таких как «12», потому что измененное значение сингла будет срабатывать при вводе «1», и оно будет исправлено на «0», поскольку 1 — нечетное число.

Исправление может быть с использованием таймера для корректировки значений в спинбокс. Например. мы перезапускаем таймер с тайм-аутом (500 мс), как только мы получили сигнал valueChanged (таймер сработает только один раз, если вы наберете достаточно быстро). И мы проверяем и исправляем ввод в слот тайм-аута таймеров.

0

Вы можете подключиться к редактированию готового сигнала и исправить его:

void Obj::onSpinEditFinished()
{
int val = ui->spinPoints->value();
if(val % 2 == 0)
ui->spinPoints->setValue(val-1);
}
0
По вопросам рекламы [email protected]