简介
当使用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的允许输入的任意整数范围。