重写验证器设置QLineEdit输入整数范围

简介

当使用QIntValidator为QLineEdit设置范围为(0,100)时,由于QLineEdit的缺陷,不能完全限制允许输入的值为0到100,而是0到999,因为输入框只能根据设置参数的位数来限制输入参数的范围。比如下限是0时,实际允许输入一位整数;上限是100时,实际允许输入三位整数,即将999作为输入上限。此时就应该重写QIntValidator的相关函数,定制判定机制。

定义

class CustomIntValidator : public QIntValidator
{
    Q_OBJECT
public:
    explicit CustomIntValidator(QObject *parent = nullptr);

    CustomIntValidator(int bottom, int top, QObject *parent);
    void setRange(int bottom, int top) override;
    virtual State validate(QString &s, int &n) const override;
    virtual void fixup(QString &input) const override;
};

实现

CustomIntValidator::CustomIntValidator(QObject *parent)
    : QIntValidator{parent}
{
}

CustomIntValidator::CustomIntValidator(int bottom, int top, QObject *parent)
    : QIntValidator(bottom, top, parent)
{
}

void CustomIntValidator::setRange(int bottom, int top)
{
    QIntValidator::setRange(bottom, top);
}

QValidator::State CustomIntValidator::validate(QString &s, int &n) const
{
    if (s.isEmpty())
    {
        return QValidator::Intermediate;
    }

    int intValue = s.toInt();
    if (intValue > top() || intValue < bottom())
        return QIntValidator::Invalid;

    return QIntValidator::validate(s, n);
}

void CustomIntValidator::fixup(QString &input) const
{
    int intValue = input.toInt();
    if (intValue < bottom())
        input = QString("%1").arg(bottom());
}

详细解释

这段代码定义了一个名为 CustomIntValidator 的类,该类继承自 Qt 框架中的 QIntValidator 类。QIntValidator 是一个整数范围验证器,用于确保用户输入的是一个在给定范围内的整数。CustomIntValidator 在此基础上做了一些定制。

下面是这段代码的详细解释:

构造函数:

CustomIntValidator::CustomIntValidator(QObject *parent): 这是一个默认构造函数,它接受一个 QObject 指针作为其父对象,并调用 QIntValidator 的默认构造函数。
CustomIntValidator::CustomIntValidator(int bottom, int top, QObject *parent): 这是另一个构造函数,它允许你指定一个整数范围(底部和顶部)以及一个父对象。它调用 QIntValidator 的相应构造函数来设置范围和父对象。

setRange 方法:

void CustomIntValidator::setRange(int bottom, int top): 这个方法允许你在对象创建后更改整数的范围。它简单地调用 QIntValidator 的 setRange 方法来执行此操作。

validate 方法:

QValidator::State CustomIntValidator::validate(QString &s, int &n) const: 这个方法用于验证给定的字符串 s 是否是一个在给定范围内的整数。
如果字符串是空的,它返回 QValidator::Intermediate,表示输入可能是有效的,但需要进一步的用户输入。
如果字符串可以转换为整数 intValue,但它不在给定的范围内(即 intValue > top() 或 intValue < bottom()),则返回 QIntValidator::Invalid。
否则,它调用 QIntValidator 的 validate 方法进行进一步的验证。

fixup 方法:

void CustomIntValidator::fixup(QString &input) const: 这个方法用于尝试修复用户输入的内容,使其成为一个有效的整数(在给定的范围内)。
如果输入的整数小于范围的底部值,它将输入字符串替换为范围的底部值的字符串表示。
请注意,如果输入的整数大于范围的顶部值,此 fixup 方法不会做任何事情。在实际应用中,你可能还想处理这种情况,例如将输入设置为范围的顶部值或清除输入。
总之,CustomIntValidator 类为 QIntValidator 提供了一些额外的定制,允许你在需要时更改范围,并在用户输入无效时尝试修复它。

应用

CustomIntValidator *validator = new CustomIntValidator(0, 100, this);
m_ui->lineEditSampleNumber->setValidator(validator);

即可实现设置QLineEdit的允许输入的任意整数范围。

  • 43
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值