я имею 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
но не могу найти пример, как его использовать.
Ну, вы можете сделать обходной путь, используя 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
, который содержит строку, которая будет показана:
ОБНОВИТЬ:
Если вам не нужно окно сообщения, вы можете:
QStatusBar
, Он может отображать сообщения, которые длятся только некоторое время (что вы его передаете). Недостатком является то, что сообщение будет отображаться на панели в нижней части окна, а не рядом с спинбоксом.QLabel
с текстом предупреждения и установите Qt::WA_DeleteOnClose
флажок, поэтому ярлык будет удален при закрытии.QTimer
с singleShot
и включите его через пару секунд (когда вы хотите, чтобы сообщение исчезло)close()
слот. Когда таймер истечет, ярлык закроется, и, благодаря WA_DeleteOnClose
, будут удалены. Что касается комментария Ричарда, я думаю, что ctrl-> setKeyboardTracking (false) обошел бы проверку, которая в противном случае происходила бы при каждом нажатии клавиши, и позволил бы валидации только в конце.
Я думаю, что правильный ответ не работает идеально. Это делает невозможным ввод значений, таких как «12», потому что измененное значение сингла будет срабатывать при вводе «1», и оно будет исправлено на «0», поскольку 1 — нечетное число.
Исправление может быть с использованием таймера для корректировки значений в спинбокс. Например. мы перезапускаем таймер с тайм-аутом (500 мс), как только мы получили сигнал valueChanged (таймер сработает только один раз, если вы наберете достаточно быстро). И мы проверяем и исправляем ввод в слот тайм-аута таймеров.
Вы можете подключиться к редактированию готового сигнала и исправить его:
void Obj::onSpinEditFinished()
{
int val = ui->spinPoints->value();
if(val % 2 == 0)
ui->spinPoints->setValue(val-1);
}