如何实现旋转框的验证器来检查是否(n mod k == 0)

How to implement a validator for a spin box to check if (n mod k == 0)?

本文关键字:检查 是否 mod 验证 实现 何实现 旋转      更新时间:2023-10-16

我有一个QSpinBox,它取int s,并设置一定的最小值和最大值。我需要在旋转框上设置一个过滤器,只允许被某个其他整数整除的数字。这似乎是QIntValidator的正确任务。但我不明白:

  • 何时返回Intermediate,何时返回Acceptable,考虑到数字可能有2到4位,在用户完全输入数字之前,无法做出决定

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

可为正负数

QSpinBox从其基类QAbstractSpinBox继承了自己的validate方法实现。如果你想定制这个方法的行为,例如通过使用QIntValidator,你需要子类QSpinBox,并在你的子类中相应地重新实现validate方法。

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

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

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

关于最小/最大值:QSpinBoxsetMinimumsetMaximum方法定义了QSpinBox::validate用来检查输入的范围。如果你按照我的建议在QSpinBox子类的validate方法的开始使用QIntValidator,你应该分别将这些最小值和最大值设置为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
}