QLineEdit自定义QDoubleValidator验证无符号整形

针对Qt中QIntValidator和QDoubleValidator的局限性,本文介绍了如何创建一个自定义验证器MyUIntValidator,用于限制无符号整数输入。该验证器确保输入在0到4294967295的范围内,不允许负数、小数和前导0。通过重写validate函数,实现了有效的输入限制和错误检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现状

  • 自定义QLineEdit输入控件,有时需要输入无符号整形数据,这时就需要对应的验证器去限制用户输入
  • Qt自带的两个验证器QIntValidator和QDoubleValidator都不能满足要求,QIntValidator范围为[-2147483648, 2147483647]范围不足,且不能限制负号、前导0;QDoubleValidator范围够大,但是不能限制负号、小数位、前导0等

解决

利用QDoubleValidator,限制范围和小数位,重写验证器函数,实现自定义验证:

  1. MyUIntValidator(QObject *parent = nullptr)
  2. 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的数据。目前效果良好。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F_WORKS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值