我有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,将被删除。
  • 09-09 23:06