【Qt】QLineEdit显示输入十六进制,位数不足时按照规则填充显示及每两个字符以空格填充

文章介绍了在Qt应用程序开发中,如何使用QRegExpValidator和QRegularExpressionValidator限制QLineEdit只输入十六进制,包括设置固定位数和格式化显示,以及正则表达式的详细解释。

问题

在实际开发中,有时候需要对输入进行限制,一是更加合理,二是防止出现误操作。
比如:
使用Qt进行应用程序开发时,对单行编辑框QLineEdit控件,设置只可输入十六进制。
限制输入的方式常用且经典的是使用正则表达式。

示例1:设置QLineEdit输入十六进制:使用QRegExpValidator进行设置

设置QLineEdit只可输入十六进制,且为了不产生歧义,编辑框前两个字符为”0x”
包含头文件:

#include <QRegExp>	// 正则表达式类
#include <QRegExpValidator> // 验证器

正则表达式:

ui->lineEdit->setText("0x");
    ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^0x[0-9a-f]+$
")));

^0x[0-9a-f]+$
是一个正则表达式,我们可以分步骤地解释它;至于没用到的就暂时不说,不然容易混淆视听:

  1. ^: 匹配字符串的开始。当此字符位于正则表达式的开始处时,它确保模式必须从字符串的开始处匹配。
  2. 0x: 这部分匹配字符串中的"0x"文字。
    [0-9a-f]: 这是一个字符集,它匹配任何一个在09或者af(小写)之间的字符。简单地说,它匹配任何一个十六进制字符。
  3. +: 表示前面的模式(在这里是[0-9a-f])可以出现一次或多次。
  4. $: 匹配字符串的结束。当此字符位于正则表达式的末尾时,它确保模式必须匹配到字符串的末尾。

因此,整个正则表达式^[0-9a-f]+$匹配的是:一个完全由十六进制字符组成的字符串。这意味着,如果一个字符串从开始到结束都是由十六进制字符组成的,那么这个正则表达式就会匹配成功。
所以,这个表达式,刚好符合咱们的需求。
为了防止误删,所以在QLineEditvoid textEdited(const QString &text)的槽函数内,添加

    QString str = arg1;
    if(str.left(2).compare(QLatin1String("0x")) != 0)
    {
   
   
        str = QStringLiteral("0x");
        ui->lineEdit_4->setText(str);
    }

这样,确保编辑框前两位一直是”0x”。

示例2:设置QLineEdit输入十六进制:使用QRegularExpressionValidator进行设置

除了使用QRegExpValidator外,还可以使用QRegularExpressionValidator
而且,在Qt 5中,新的qregulareexpression类提供了正则表达式的Perl兼容实现,建议代替QRegExp

    ui->lineEdit->setText("0x");
    ui->lineEdit->setValidator(new QRegularExpressionValidator(QRegularExpression("^0x[0-9a-f]+$")));

限制输入位数

如,限制只能输入3个十六进制位数

ui->lineEdit->setText("0x");
    ui->lineEdit->setValidator(new QRegularExpressionValidator(QRegularExpression("^0x[0-9a-f]{1,3}$")));

^0x[0-9a-f]{1,3}$

  1. ^: 匹配字符串的开始。
  2. 0x: 这部分匹配字符串中的"0x"文字。
  3. [0-9a-f]: 这是一个字符集,它匹配任何一个在09或者af(小写)之间的字符。简单地说,它匹配任何一个十六进制字符。
  4. {1,3}: 这是一个数量修饰符,它表示前面的模式(在这里是[0-9a-f])可以出现1到3次。
  5. $: 匹配字符串的结束。

^0x[0-9a-f]{1,3}$的意思是:一个以"0x"开头并且其后紧跟1到3个十六进制字符的字符串。字符串以"0x"开始,并且从"0x"之后开始有1到3个十六进制字符,然后字符串结束,那么这个正则表达式就会匹配成功。例如,“0xa”、"0x12"和"0x123"都是与该正则表达式匹配的字符串,但"0x"或"0x1234"则不匹配。

当输入位数不足时,前面填充’0’

查询QString类帮助文档,发现有两个成员方法符合需求
1.inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const;

    QString strArg = ui->lineEdit->text().trimmed(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FreeLikeTheWind.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值