我有一个采用QSpinBoxint,并设置了一定的最小值和最大值。我需要在旋转框上设置一个过滤器,以仅允许被某个其他整数整除的数字。对于QIntValidator来说,这似乎是正确的任务。但我不明白:

  • 何时返回Intermediate和何时Acceptable,鉴于该数字可能有2到4位数字,并且直到用户完全输入该数字时,才可以决定
  • 如何处理最小值和最大值的设置:目前,我分别使用setMinimumValue()setMaximumValue()进行设置;在这方面,安装验证器有什么变化?

  • 该数字可以是负数,也可以是正数。

    最佳答案

    QSpinBox拥有从其基类validate继承的QAbstractSpinBox方法的实现。如果要自定义此方法的行为(例如,通过使用QIntValidator),则需要子类QSpinBox并在子类中相应地重新实现validate方法。

    您需要的逻辑-“仅允许数字除以某个其他整数”-超出了QIntValidator的功能范围。它所能做的就是说是否可以将给定的字符串转换为指定范围内的整数,或者是否可以将给定的字符串扩展为可转换为此类整数(Intermediate状态)。

    我认为您可以将QIntValidator用作QSpinBox子类的validate方法实现中的预处理器:您首先调用QIntValidator::validate,如果它返回Invalid状态,则您的方法也是如此。但是,如果返回IntermediateAcceptable,则需要自己继续:

  • 输入字符串并尝试将其转换为整数-QString::toInt应该足够了。
  • 对自己的逻辑进行编码,该逻辑将查看接收到的整数并确定该整数是否可被某个其他整数整除。如果是,则您的方法返回Acceptable状态。如果不是,则需要以某种方式弄清楚此整数是否可以“扩展”为可接受的。例如,您说的数字长度可以是2到4个字符-这意味着可以扩展至少一个1、2和3位整数的子集以变得可以接受。如果处理的整数属于此类子集,则您的方法应返回Intermediate,否则应返回Invalid

  • 关于最小值/最大值:QSpinBoxsetMinimumsetMaximum方法定义QSpinBox::validate用于检查输入的范围。如果您遵循我的建议,在QIntValidator子类的validate方法的开头使用QSpinBox,则应将这些最小值和最大值分别设置为QIntValidator的bottom和top属性:
    class MySpinBox: public QSpinBox
    {
        <...>
    };
    
    QValidator::State MySpinBox::validate(QString &text, int &pos) const
    {
        QIntValidator validator;
        validator.setBottom(minimum());
        validator.setTop(maximum());
        QValidator::State state = validator.validate(text, pos);
        if (state == QValidator::Invalid) {
            return state;
        }
    
        <...> // Otherwise proceed with your own logics
    }
    

    10-04 12:59