2

我有一个QSpinBox需要ints 的,设置了一定的最小值和最大值。我需要在旋转框上设置一个过滤器,只允许被某个其他整数整除的数字。这似乎是QIntValidator. 但我不明白:

  • 什么时候返回Intermediate,什么时候返回Acceptable,鉴于号码可能有2到4位数字,并且直到用户完全输入号码,才能做出决定

  • 如何处理设置最小值和最大值:目前,我分别使用setMinimumValue()和设置它们setMaximumValue();在这方面安装验证器有什么变化?

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

4

1 回答 1

3

QSpinBox有自己的validate从其基类继承的方法实现QAbstractSpinBox。如果您想自定义此方法的行为,例如使用QIntValidator,您需要在您的子类中相应地子类QSpinBox化并重新实现该validate方法。

您需要的逻辑 - “只允许被某个其他整数整除的数字” - 超出了QIntValidator's 的能力范围。它所能做的就是说明给定的字符串是否可以转换为指定范围内的整数 - 或者给定的字符串是否可以扩展为可转换为这样的整数(Intermediate状态)。

我认为您可以在子类的方法实现QIntValidator中用作预处理器:您首先调用,如果它返回状态,您的方法也会返回。但如果它返回or ,您需要自行处理:QSpinBoxvalidateQIntValidator::validateInvalidIntermediateAcceptable

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

关于 min/max values:和方法定义了用于检查输入QSpinBox的范围。如果您遵循我在子类的方法开头使用的建议,则应将这些最小值和最大值分别设置为的底部和顶部属性:setMinimumsetMaximumQSpinBox::validateQIntValidatorvalidateQSpinBoxQIntValidator

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
}
于 2016-11-04T06:40:31.037 回答