现状
- 自定义QLineEdit输入控件,有时需要输入无符号整形数据,这时就需要对应的验证器去限制用户输入
- Qt自带的两个验证器QIntValidator和QDoubleValidator都不能满足要求,QIntValidator范围为[-2147483648, 2147483647]范围不足,且不能限制负号、前导0;QDoubleValidator范围够大,但是不能限制负号、小数位、前导0等
解决
利用QDoubleValidator,限制范围和小数位,重写验证器函数,实现自定义验证:
MyUIntValidator(QObject *parent = nullptr)
QValidator::State validate(QString &s, int &i) const;
代码
1. MyUIntValidator(QObject *parent = nullptr)
MyUIntValidator::MyUIntValidator(QObject *parent)
: QDoubleValidator{parent}
{
{
//直接设置为UInt范围
this->setDecimals(0);
this->setBottom(uint(0));
this->setTop(uint(4294967295));
}
}
2. QValidator::State validate(QString &s, int &i) const;
QValidator::State MyUIntValidator::validate(QString &str, int &i) const
{
//先判断是不是空字符串
if(str.isEmpty())
return Intermediate;
//无符号整形没有负数
if(str.startsWith("-"))
return Invalid;
//不能输入小数点
if(str.count(".") > 0)
return Invalid;
bool ok = false;
uint val = str.toUInt(&ok);
QString strTem = QString::number(val);
//转化不成功,说明输入了非法字符串
if(!ok)
return Invalid;
//防止数字前面输入前导0,合法模板长度小于输入字符串,说明有前导0
if(strTem.length() < str.length())
return Invalid;
//进行范围验证
if(val < bottom() | val > top())
return Invalid;
return Acceptable;
}
测试
可以有效限制输入数据在[0, 4294967295]范围内,且无法输入非法字符,无法输入带前导0的数据。目前效果良好。