如何实现旋转框的验证器来检查是否(n mod k == 0)
How to implement a validator for a spin box to check if (n mod k == 0)?
我有一个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
}
- 检查是否以特定精度给出双精度
- 地图计数确实很重要,或者只是检查是否存在
- 检查是否安装了 windows10 C++
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- MPI:检查是否有任何进程已终止
- 给定一个大小为 N 的数组 S,检查是否可以将序列拆分为两个序列
- Vulkan 的传输队列系列功能和显卡支持:条件检查是否准确?
- 如何检查是否定义了固定宽度的整数
- 使用预处理指令检查是否包含标头?
- 在预处理器中检查 g++ 是否使用 -fopenmp 调用
- 将字符串转换为整数类型T,检查是否存在溢出
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 检查是否至少设置了一点而不跳跃
- 在if条件下,右或左改变值的相等性检查是否有任何区别
- C++ 检查是否按下了键,而不是按住了
- 如何在 c++ 中解析包含整数的字符串并检查是否大于最大值
- 检查是否为质数大o
- 检查是否需要 utf8 转换并转换为 utf8
- 如何正确检查 c++ 是否存在注册表项?