我的QSpinBox应该只接受奇数,所以我将初始值设置为3,并将步长设置为2。
QSpinBox* spinBox = new QSpinBox;
spinBox->setValue(3);
spinBox->setSingleStep(2);当我使用旋转框箭头修改值时,一切都是正常的。但是当我从键盘上输入值时,它可以接受不是奇数的。
那么,是否可以在不继承QSpinBox并重新定义其validate方法的情况下设置满足我需求的验证呢?
我目前的解决方案是,如果值为奇数,则检查slot:
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值应该是奇数。我在QWidget中找到了statusTip属性,但找不到如何使用它的示例。
发布于 2012-09-27 15:56:43
你可以使用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 );
}
}现在,如果您希望保留旧值以防used输入偶数,则必须从QSpinBox继承,或者使用事件过滤器来捕获按键事件,并在值更改之前执行操作。
要在用户将鼠标悬停在微调框上时显示消息,您需要设置该框的toolTip,它包含将要显示的字符串:

更新:如果您不需要消息框,您可以:
QStatusBar。它可以显示仅持续一段时间的消息(即您传递的消息)。它的缺点是,消息将出现在窗口底部的栏上,而不是靠近微调框下的spinbox.QLabel,并设置Qt::WA_DeleteOnClose标志,这样标签就会在使用QTimer singleShot时自行删除,并将其设置为几秒钟后触发(当你想让消息将定时器的信号发送到标签的close()槽时)。当计时器到期时,标签将被关闭,并且,由于WA_DeleteOnClose,将被删除。
发布于 2014-03-10 03:22:07
您可以连接到editingFinished信号并修复它:
void Obj::onSpinEditFinished()
{
int val = ui->spinPoints->value();
if(val % 2 == 0)
ui->spinPoints->setValue(val-1);
}发布于 2015-02-27 17:34:23
关于Richard的评论,我认为ctrl->setKeyboardTracking(false)可以绕过在每次击键时进行的检查,并且只允许在最后进行验证。
https://stackoverflow.com/questions/12616120
复制相似问题