Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为自旋框实现验证器以检查(n mod k==0)?_C++_Qt_Validation_Qt5_Qspinbox - Fatal编程技术网

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){
    返回状态;
    }
    //否则,继续你自己的逻辑
    }