QSpinBox
有自己的validate
从其基类继承的方法实现QAbstractSpinBox
。如果您想自定义此方法的行为,例如使用QIntValidator
,您需要在您的子类中相应地子类QSpinBox
化并重新实现该validate
方法。
您需要的逻辑 - “只允许被某个其他整数整除的数字” - 超出了QIntValidator
's 的能力范围。它所能做的就是说明给定的字符串是否可以转换为指定范围内的整数 - 或者给定的字符串是否可以扩展为可转换为这样的整数(Intermediate
状态)。
我认为您可以在子类的方法实现QIntValidator
中用作预处理器:您首先调用,如果它返回状态,您的方法也会返回。但如果它返回or ,您需要自行处理:QSpinBox
validate
QIntValidator::validate
Invalid
Intermediate
Acceptable
- 获取输入字符串并尝试将其转换为整数 - 可能
QString::toInt
就足够了。
- 编码您自己的逻辑,查看接收到的整数并确定它是否可以被某个其他整数整除。如果是,您的方法将返回
Acceptable
状态。如果不是,您需要以某种方式确定该整数是否可以“扩展”以变得可以接受。例如,您说数字可以是 2 到 4 个字符长 - 这意味着至少可以扩展 1、2 和 3 位整数的子集以变得可以接受。如果处理后的整数属于这样的子集,则您的方法应返回Intermediate
,否则应返回Invalid
。
关于 min/max values:和方法定义了用于检查输入QSpinBox
的范围。如果您遵循我在子类的方法开头使用的建议,则应将这些最小值和最大值分别设置为的底部和顶部属性:setMinimum
setMaximum
QSpinBox::validate
QIntValidator
validate
QSpinBox
QIntValidator
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
}