我有一个采用QSpinBox
的int
,并设置了一定的最小值和最大值。我需要在旋转框上设置一个过滤器,以仅允许被某个其他整数整除的数字。对于QIntValidator
来说,这似乎是正确的任务。但我不明白:
Intermediate
和何时Acceptable
,鉴于该数字可能有2到4位数字,并且直到用户完全输入该数字时,才可以决定setMinimumValue()
和setMaximumValue()
进行设置;在这方面,安装验证器有什么变化? 该数字可以是负数,也可以是正数。
最佳答案
QSpinBox
拥有从其基类validate
继承的QAbstractSpinBox
方法的实现。如果要自定义此方法的行为(例如,通过使用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
用于检查输入的范围。如果您遵循我的建议,在QIntValidator
子类的validate
方法的开头使用QSpinBox
,则应将这些最小值和最大值分别设置为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
}