问题:
使用QIntValidator对QLineEdeit的最大值或最小值进行限制时,如设置范围为[25,300],发现最小值依然可以在25之下
解决方法:一般都是采用重写QValidator的成员函数validate和fixedup
首先先来回顾一下重载和重写的区别:
重载:函数名相同,但是参数列表(参数个数、参数类型、参数顺序)不同。调用时根据参数列表来决定调用哪个函数。
- 函数名相同
- 参数列表不同
- 不关心函数返回类型
- 同一个类
重写:是指在派生类中对基类中虚函数的重新实现,函数名和参数列表相同,但是函数体不同。
- 不同类(派生类和基类)
- 函数名和参数列表相同
- 函数体不同
区别:
- 范围区别:重载和被重载需要在一个类中;重写和被重写在不同的类中。
- 形式区别:重载和被重载的函数名相同,参数列表不同;重写和被重写的函数名和参数列表相同,函数体不同。
- virtual区别:重载和被重载可以被virtual修饰也可以没有;重写和被重写必须要有vritual修饰。
回归正题:
解决方法就是子啊派生类中重写基类中的validate和fixedup虚函数
virtual State validate(QString &, int &) const = 0;
virtual void fixup(QString &) const;
QValidator::validate()是验证的过程,返回结果是State。每当输入有变化时调用此方法
验证的三种状态:
enum State {
Invalid, //验证通不过
Intermediate, //输入未完成,不确定是否能通过验证
Acceptable //验证通过
}
当验证通不过时,通过调用 QValidator::fixedup()是这个函数修复错误。
class TestValidator : public QIntValidator
{
Q_OBJECT
public:
explicit TestValidator(QObject * parent = 0):QIntValidator(parent)
{
}
TestValidator(int bottom, int top, QObject * parent):QIntValidator(bottom, top, parent)
{
}
virtual void setRange(int bottom, int top)
{
QIntValidator::setRange(bottom, top);
}
~TestValidator()
{
}
virtual State validate(QString &s, int &n) const
{
return QIntValidator::validate(s, n);
}
virtual void fixup(QString &s) const
{
s = QString("%1").arg(bottom());
}
};
参考文章:
https://blog.csdn.net/firecityplans/article/details/99440955
https://blog.csdn.net/hfhuazai/article/details/86711903