我有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
,将被删除。