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

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

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

可正可负

QSpinBox 有自己的 validate 方法的实现,继承自其基础 class QAbstractSpinBox。如果您想自定义此方法的行为,例如使用 QIntValidator,您需要 subclass QSpinBox 并相应地在您的 sub[=] 中重新实现 validate 方法55=].

您需要的逻辑 - "allow only numbers divisible by a certain other integer number" - 超出了 QIntValidator 的能力范围。它所能做的就是说给定的字符串是否可以转换为指定范围内的整数 - 或者给定的字符串是否可以扩展为可转换为这样的整数(Intermediate 状态)。

我认为您可以在 QSpinBox subclass' validate 方法实现中使用 QIntValidator 作为预处理器:您先调用 QIntValidator::validate,如果它 return 是 Invalid 状态,您的方法也是如此。但是如果是returns Intermediate或者Acceptable,你需要自己进行:

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

关于 min/max 值:QSpinBoxsetMinimumsetMaximum 方法定义了 QSpinBox::validate 用于检查输入的范围。如果您按照我的建议在 QSpinBox subclass 的 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
}