C++ 如何为自旋框实现验证器以检查(n mod k==0)?
我有一个C++ 如何为自旋框实现验证器以检查(n mod k==0)?,c++,qt,validation,qt5,qspinbox,C++,Qt,Validation,Qt5,Qspinbox,我有一个QSpinBox,它接受ints,并设置了一定的最小值和最大值。我需要在旋转框上设置一个过滤器,只允许数字被其他整数整除。这似乎是QIntValidator的正确任务。但我不明白: 何时返回中间值,何时返回可接受值,由于数字可能有2到4位,在用户完全输入数字之前,无法做出任何决定 如何处理设置最小值和最大值:目前,我分别使用setMinimumValue()和setMaximumValue()进行设置;在这方面,安装验证器会有什么变化 数字可以是负数也可以是正数。QSpinBox有自
QSpinBox
,它接受int
s,并设置了一定的最小值和最大值。我需要在旋转框上设置一个过滤器,只允许数字被其他整数整除。这似乎是QIntValidator
的正确任务。但我不明白:
- 何时返回中间值,何时返回可接受值,由于数字可能有2到4位,在用户完全输入数字之前,无法做出任何决定
- 如何处理设置最小值和最大值:目前,我分别使用
和setMinimumValue()
进行设置;在这方面,安装验证器会有什么变化setMaximumValue()
数字可以是负数也可以是正数。
QSpinBox
有自己的validate
方法实现,该方法继承自其基类QAbstractSpinBox
。如果要自定义此方法的行为,例如通过使用QIntValidator
,则需要对QSpinBox
进行子类化,并在子类中相应地重新实现validate
方法
您需要的逻辑-“仅允许可被某个其他整数整除的数字”-超出了QIntValidator
的功能范围。它所能做的只是说明给定的字符串是否可以在指定的范围内转换为整数,或者给定的字符串是否可以扩展为可转换为这样的整数(Intermediate
state)
我认为您可以使用QIntValidator
作为QSpinBox
子类validate
方法实现中的预处理器:首先调用QIntValidator::validate
,如果它返回无效
状态,您的方法也会返回。但如果它返回中间值
或可接受值
,则您需要自行执行:
QString::toInt
就足够了李>
Acceptable
状态。如果不是,您需要弄清楚这个整数是否可以“扩展”为可接受的。例如,您说数字可以是2到4个字符长-这意味着至少可以扩展1、2和3位整数的子集以使其成为可接受的。如果处理后的整数属于这样的子集,则您的方法应返回Intermediate
,否则应返回Invalid
李>
关于最小值/最大值:QSpinBox
的setMinimum
和setmax
方法定义了QSpinBox::validate
用于检查输入的范围。如果您按照我的建议在QSpinBox
子类的validate
方法的开头使用QIntValidator
,您应该分别将这些最小值和最大值设置为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
}
class MySpinBox:public QSpinBox
{
};
QValidator::State MySpinBox::validate(QString&text,int&pos)常量
{
QIntValidator验证器;
验证器.setBottom(最小值());
setTop(最大值());
QValidator::State State=validator.validate(文本,pos);
if(state==QValidator::Invalid){
返回状态;
}
//否则,继续你自己的逻辑
}