我有一个QSpinBox
,它取int
s,并设置一定的最小值和最大值。我需要在旋转框上设置一个过滤器,只允许被某个其他整数整除的数字。这似乎是QIntValidator
的正确任务。但我不明白:
-
何时返回
Intermediate
,何时返回Acceptable
,考虑到数字可能有2到4位,在用户完全输入数字之前,无法做出决定 -
如何处理设置最小和最大值:目前我分别使用
setMinimumValue()
和setMaximumValue()
进行设置;在这方面安装验证器会改变什么?
可为正负数
QSpinBox
从其基类QAbstractSpinBox
继承了自己的validate
方法实现。如果你想定制这个方法的行为,例如通过使用QIntValidator
,你需要子类QSpinBox
,并在你的子类中相应地重新实现validate
方法。
您需要的逻辑-"只允许被某个其他整数整除的数字"-超出了QIntValidator
的能力范围。它所能做的只是说明给定字符串是否可以在指定范围内转换为整数,或者给定字符串是否可以扩展为可转换为这样的整数(Intermediate
状态)。
我认为你可以使用QIntValidator
作为你的QSpinBox
子类的validate
方法实现中的预处理器:你先调用QIntValidator::validate
,如果它返回Invalid
状态,你的方法也是如此。但是如果它返回Intermediate
或Acceptable
,则需要自己继续:
- 获取输入字符串并尝试将其转换为整数-也许
QString::toInt
应该足够了。 - 编码您自己的逻辑,它查看接收到的整数并确定它是否可以被某个其他整数整除。如果是,你的方法返回
Acceptable
状态。如果不是,您需要弄清楚这个整数是否可以"扩展"为可接受的。例如,您说数字可以是2到4个字符长-这意味着至少可以扩展1、2和3位数整数的子集,使其成为可接受的。如果处理的整数属于这样一个子集,那么方法应该返回Intermediate
,否则应该返回Invalid
。
关于最小/最大值:QSpinBox
的setMinimum
和setMaximum
方法定义了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
}