如何为旋转框实现验证器以检查是否 (n mod k == 0)?
How to implement a validator for a spin box to check if (n mod k == 0)?
我有一个 QSpinBox
需要 int
秒,并设置了特定的最小值和最大值。我需要在旋转框上设置一个过滤器,只允许被某个其他整数整除的数字。这似乎是 QIntValidator
的正确任务。但是我不明白:
什么时候到return什么时候Intermediate
什么时候Acceptable
,假设这个号码可能有2到4个数字,直到这个号码被用户,无法做出决定
如何处理设置最小值和最大值:目前,我分别使用setMinimumValue()
和setMaximumValue()
设置它们;在这方面安装验证器有什么变化?
可正可负
QSpinBox
有自己的 validate
方法的实现,继承自其基础 class QAbstractSpinBox
。如果您想自定义此方法的行为,例如使用 QIntValidator
,您需要 subclass QSpinBox
并相应地在您的 sub[=] 中重新实现 validate
方法55=].
您需要的逻辑 - "allow only numbers divisible by a certain other integer number" - 超出了 QIntValidator
的能力范围。它所能做的就是说给定的字符串是否可以转换为指定范围内的整数 - 或者给定的字符串是否可以扩展为可转换为这样的整数(Intermediate
状态)。
我认为您可以在 QSpinBox
subclass' validate
方法实现中使用 QIntValidator
作为预处理器:您先调用 QIntValidator::validate
,如果它 return 是 Invalid
状态,您的方法也是如此。但是如果是returns Intermediate
或者Acceptable
,你需要自己进行:
- 获取输入字符串并尝试将其转换为整数 -
可能
QString::toInt
就足够了。
- 编码您自己的逻辑,它查看接收到的整数并确定它是否可以被某个其他整数整除。如果是,您的方法 returns
Acceptable
状态。如果不是,您需要以某种方式弄清楚这个整数是否可以 "extended" 变得可以接受。例如,您说数字可以是 2 到 4 个字符长 - 这意味着至少可以扩展 1、2 和 3 位整数的子集以使其变得可接受。如果处理后的整数属于这样的子集,你的方法应该returnIntermediate
,否则应该returnInvalid
。
关于 min/max 值:QSpinBox
的 setMinimum
和 setMaximum
方法定义了 QSpinBox::validate
用于检查输入的范围。如果您按照我的建议在 QSpinBox
subclass 的 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
}
我有一个 QSpinBox
需要 int
秒,并设置了特定的最小值和最大值。我需要在旋转框上设置一个过滤器,只允许被某个其他整数整除的数字。这似乎是 QIntValidator
的正确任务。但是我不明白:
什么时候到return什么时候
Intermediate
什么时候Acceptable
,假设这个号码可能有2到4个数字,直到这个号码被用户,无法做出决定如何处理设置最小值和最大值:目前,我分别使用
setMinimumValue()
和setMaximumValue()
设置它们;在这方面安装验证器有什么变化?
可正可负
QSpinBox
有自己的 validate
方法的实现,继承自其基础 class QAbstractSpinBox
。如果您想自定义此方法的行为,例如使用 QIntValidator
,您需要 subclass QSpinBox
并相应地在您的 sub[=] 中重新实现 validate
方法55=].
您需要的逻辑 - "allow only numbers divisible by a certain other integer number" - 超出了 QIntValidator
的能力范围。它所能做的就是说给定的字符串是否可以转换为指定范围内的整数 - 或者给定的字符串是否可以扩展为可转换为这样的整数(Intermediate
状态)。
我认为您可以在 QSpinBox
subclass' validate
方法实现中使用 QIntValidator
作为预处理器:您先调用 QIntValidator::validate
,如果它 return 是 Invalid
状态,您的方法也是如此。但是如果是returns Intermediate
或者Acceptable
,你需要自己进行:
- 获取输入字符串并尝试将其转换为整数 -
可能
QString::toInt
就足够了。 - 编码您自己的逻辑,它查看接收到的整数并确定它是否可以被某个其他整数整除。如果是,您的方法 returns
Acceptable
状态。如果不是,您需要以某种方式弄清楚这个整数是否可以 "extended" 变得可以接受。例如,您说数字可以是 2 到 4 个字符长 - 这意味着至少可以扩展 1、2 和 3 位整数的子集以使其变得可接受。如果处理后的整数属于这样的子集,你的方法应该returnIntermediate
,否则应该returnInvalid
。
关于 min/max 值:QSpinBox
的 setMinimum
和 setMaximum
方法定义了 QSpinBox::validate
用于检查输入的范围。如果您按照我的建议在 QSpinBox
subclass 的 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
}