2

我有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但找不到如何使用它的示例。

4

5 回答 5

4

您可以连接到 editingFinished 信号并修复它:

void Obj::onSpinEditFinished()
{
    int val = ui->spinPoints->value();
    if(val % 2 == 0)
        ui->spinPoints->setValue(val-1);
}
于 2014-03-09T19:22:06.633 回答
3

关于理查德的评论,我认为 ctrl->setKeyboardTracking(false) 将绕过每次击键时会发生的检查,并只允许验证在最后发生。

于 2015-02-27T09:34:23.423 回答
0

好吧,您可以使用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 输入偶数,则必须继承 fromQSpinBox或使用事件过滤器来捕获按键事件,并在值更改之前采取行动。

要在用户将鼠标悬停在 spinbox 上时显示消息,您需要设置 box 的toolTip,它包含将显示的字符串:

带有工具提示的旋转框

更新:如果您不想要消息框,您可以:

  • 使用QStatusBar. 它可以显示仅持续一段时间的消息(您通过它)。它的缺点是消息将出现在窗口底部的栏上,而不是靠近旋转框。
  • 在旋转框下方放置一个标签。当用户输入无效值时,将标签的文本设置为“只允许奇数值”之类的内容,并在用户输入正确值时设置一个空字符串。您也可以动态执行此操作:
    1. 用户输入了错误的值
    2. QLabel使用警告文本创建一个,并设置Qt::WA_DeleteOnClose标志,以便标签在关闭时自行删除。
    3. 创建一个QTimerwith singleShot,并在几秒钟后将其设置为触发(当您希望消息消失时)
    4. 将计时器的信号连接到标签的close()插槽。当计时器到期时,标签将被关闭,并且由于WA_DeleteOnClose,将被删除。
于 2012-09-27T07:56:43.400 回答
0

我认为正确的答案并不完美。它使您无法输入诸如“12”之类的值,因为输入“1”时将触发值更改信号,并将其更正为“0”,因为1是奇数。

修复可能是使用计时器来更正旋转框中的值。例如,一旦我们收到 valueChanged 信号,我们就会用 (500ms) 超时重新启动一个计时器(如果你输入足够快,计时器只会触发一次)。我们检查并更正定时器超时槽中的输入。

于 2013-12-20T11:32:01.250 回答
0

在 python 中,我使用 spinbox 的 editingFinished 属性解决了这个问题。这只会在您按下回车键或将焦点从框移开时触发信号。在python中,我必须传递函数引用,否则传递的值不是更新的值,而是初始化时的值。:

class SpinboxExample:
    def __init__(self)
        spinbox = QSpinBox()
        spinbox.editingFinished.connect(
            lambda value=spinbox.value, set_spinbox_val=spinbox.setValue:
            self.value_changed_spinbox(value,set_spinbox_val, set_slider_val)
            )

然后我有一个回调函数,它检查数字是否为奇数,如果没有更改旋转框中的值以使其为奇数。

    def value_changed_spinbox(self, get_value,set_spinbox_value):
        value=get_value()
        if value % 2 == 0:
            value += 1
            set_spinbox_value(value)

希望有帮助。

于 2020-06-02T16:41:26.763 回答