Qt学习笔记(1):QIntValidator设置范围无效

问题:
使用QIntValidator对QLineEdeit的最大值或最小值进行限制时,如设置范围为[25,300],发现最小值依然可以在25之下

解决方法:一般都是采用重写QValidator的成员函数validate和fixedup

首先先来回顾一下重载和重写的区别:

重载:函数名相同,但是参数列表(参数个数、参数类型、参数顺序)不同。调用时根据参数列表来决定调用哪个函数。

  1. 函数名相同
  2. 参数列表不同
  3. 不关心函数返回类型
  4. 同一个类

重写:是指在派生类中对基类中虚函数的重新实现,函数名和参数列表相同,但是函数体不同。

  1. 不同类(派生类和基类)
  2. 函数名和参数列表相同
  3. 函数体不同

区别

  1. 范围区别:重载和被重载需要在一个类中;重写和被重写在不同的类中。
  2. 形式区别:重载和被重载的函数名相同,参数列表不同;重写和被重写的函数名和参数列表相同,函数体不同。
  3. 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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值