【Qt】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();
    QString str = QString("%1").arg(strArg);

    str = QString("0x%1").arg(str.toInt(0, 16), 3, 16, QChar('0'));

    ui->lineEdit->setText(str);

如输入

f

输出就是

0x00f

2.QString rightJustified(int width, QChar fill = QLatin1Char(' '), bool trunc = false) const Q_REQUIRED_RESULT;
最后一个参数是如果truncate为false且字符串的size()大于width,则返回的字符串是该字符串的副本。
如果truncate为true并且字符串的size()大于width,则结果字符串将在位置width处被截断。

    QString str = QString("%1%2%3%4%5%6%7%8%9").arg("a", "b", "c", "d", "e", "f", "g", "h", "i");
    bool bTrunc = false;
    str = str.rightJustified(10, QChar('0'), bTrunc);

输出就是

0abcdefghi

除了以上两种方式外,哈可以自己判断进行填充。

        QString str = "0xfe";
        if(str.toInt(0, 16) < 0x10)
        {
            str = QString("0x00%1").arg(QString::number(str.toInt(0, 16), 16));
        }else if(str.toInt(0, 16) < 0x100){
            str = QString("0x0%1").arg(QString::number(str.toInt(0, 16), 16));
        }else if(str.toInt(0, 16) < 0x1000){
            str = QString("0x%1").arg(QString::number(str.toInt(0, 16), 16));
        }

        qDebug().noquote() << "str :" << str; // "0x0fe"

每两位字符以空格隔开

当十六进制输入位数多时,如abcdefg这样,会显示拥挤,没有ab cd ef g看起来整洁。
如何让每两个字符以空格隔开呢?
提供以下4中方式:

方式1:进行位数判断,每次都取两位进行空格填充
    QString strArg = ui->lineEdit->text().trimmed();
    // 填充
    QString str = QString("0x%1").arg(strArg.toInt(0, 16), 3, 16, QChar('0'));

    // 如:0xaabbccdde  输出: 0x aa bb cc dd e
    QString strSour = str;
    // 替换掉空格
    strSour = strSour.replace(" ", "");
    QString strRes = "";    // 结果

    int strLen = strSour.count();
    if(strSour.left(2).compare(QLatin1String("0x")) == 0)
    {
        if(strLen > 2)
        {
            // 判断奇偶
            if(0 == strLen%2)
            {
                // 取最后2位之前的子串
                for(int i = 0; i < strLen/2-1; ++i)
                {
                    QString strTmp = strSour.mid(i*2, 2);
                    strRes += strTmp + " ";
                }
                // 加上的子串
                strRes += strSour.right(2);
            }else{
                // 取最后1位之前的子串
                for(int i = 0; i <= strLen/2-1; ++i)
                {
                    QString strTmp = strSour.mid(i*2, 2);
                    strRes += strTmp + " ";
                }
                // 加上的子串
                strRes += strSour.right(1); // 加上最后的一位
            }
            ui->lineEdit->setText(strRes);
        }
    }else{
        // send error
        
    }
方式2:优化方法一

去掉奇偶判断,只判断最后一位或者两位,代码立刻优雅起来。

    QString strArg = ui->lineEdit->text().trimmed();
    // 填充
    QString str = QString("0x%1").arg(strArg.toInt(0, 16), 3, 16, QChar('0'));

    // 如:0xaabbccdde  输出: 0x aa bb cc dd e
    QString strSour = str;
    // 替换掉空格
    strSour = strSour.replace(" ", "");
    QString strRes = "";    // 结果

    int strLen = strSour.count();
    if(strSour.left(2).compare(QLatin1String("0x")) == 0)
    {
        if(strLen > 2)
        {
            for(int i = 0; i < strLen/2-1; i++)
            {
                QString strTmp = strSour.mid(i*2, 2);
                strRes += strTmp + " ";
            }
            // 根据奇偶,加上最后的1或者2位
            strRes += strSour.right(strLen%2 == 0 ? 2 : 1);

            ui->lineEdit->setText(strRes);
        }
    }else{
        // send error

    }
方式3:使用while循环
    QString strArg = ui->lineEdit->text().trimmed(); // aabbc
    // 填充
    QString str = QString("0x%1").arg(strArg.toInt(0, 16), 3, 16, QChar('0')); // 0xaabbc
    str = str.replace(" ", "");
    int nLen = str.length();
    int nIndex = 0;
    while( 2*(nIndex+1) < nLen )
    {
        str.insert(2*(nIndex+1), " ");
        ++nIndex;
    }
    ui->lineEdit->setText(str); // 0x aa bb c
方式4:使用正则表达式,推荐
    QString strArg = ui->lineEdit->text().trimmed();
    // 填充
    QString str = QString("0x%1").arg(strArg.toInt(0, 16), 3, 16, QChar('0'));
    str = str.replace(" ", ""); // 0xaabbccdde
    QRegExp regex("(.{2})"); // 正则表达式,匹配任意两个字符

    // 使用正则表达式进行替换操作,将匹配到的两个字符之间添加空格
    QString result = str.replace(regex, "\\1 ");

    ui->lineEdit->setText(result); // 0x aa bb cc dd e

在这里插入图片描述

结论

一个人如果没有梦想,跟无忧无虑有什么区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/224012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

限流算法,基于go的gRPC 实现的

目录 一、单机限流 1、令牌桶算法 3、固定窗口限流算法 4、滑动窗口 二、集群限流 1、分布式固定窗口 &#xff08;基于redis&#xff09; 2、分布式滑动窗口 一、单机限流 1、令牌桶算法 令牌桶算法是当流量进入系统前需要获取令牌&#xff0c;没有令牌那么就要进行限…

Docker+jenkins+gitlab实现持续集成

1.安装环境 服务器ip虚拟机版本192.168.5.132centos7.6192.168.5.152centos7.6 2. 安装docker 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息&#xff0c;要确保centos7能上外网 yum-config-manager --add-repo http:…

什么是数据清洗、特征工程、数据可视化、数据挖掘与建模?

1.1什么是数据清洗、特征工程、数据可视化、数据挖掘与建模&#xff1f; 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.1节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵…

智篆商业的电商运营课程:超越传统,引领未来

智篆商业一直以来都是电商运营课程领域的领军者&#xff0c;其成功之处在于超越传统&#xff0c;不断引领未来。探究智篆商业的成功之道&#xff0c;我们将发现其可信度和培训专业性是学员信赖的根本原因。 首先&#xff0c;智篆商业注重构建强大的导师团队。导师们不仅拥有丰富…

持续集成交付CICD:Jenkins使用GitLab共享库实现自动更新前后端项目质量配置

目录 一、实验 1.Jenkins使用GitLab共享库实现自动更新后端项目质量配置 2.Jenkins使用GitLab共享库实现自动更新前端项目质量配置 二、问题 1.Sonarqube如何添加自定义质量阈 一、实验 1.Jenkins使用GitLab共享库实现自动更新后端项目质量配置 (1)修改GitLab的Sonar.gr…

HBase-架构与设计

HBase架构与设计 一、背景二、HBase概述1.设计特点2.适用场景2.1 海量数据2.2 稀疏数据2.3 多版本数据2.4 半结构或者非结构化数据 三、数据模型1.RowKey2.Column Family3.TimeStamp 四、HBase架构图1.Client2.Zookeeper3.HMaster4.HRegionServer5.HRegion6.Store7.StoreFile8.…

flink使用事件时间时警惕kafka不同分区的事件时间倾斜问题

背景 flink和kafka的消息组合消费模式几乎是实时流处理的标配&#xff0c;然后当在flink中使用事件时间处理时&#xff0c;需要注意kafka不同分区元素之间时间相差太大的问题&#xff0c;这样有可能会导致严重的数据堆积问题 kafka不同分区元素事件时间差异较大导致的问题 总…

分布式光伏电站监控运维系统的简单介绍-安科瑞黄安南

摘要&#xff1a;设计了一套更高性价比&#xff0c;且容易操作的电站监控系统。该系统融合了互联网和物联网&#xff0c;并为光伏电数据的传输构建了相应的通道&#xff0c;可支持云存储等功能&#xff0c;同时也为用户提供了多元化的查询功能。 关键词&#xff1a;分布式太阳能…

gitLab 和Idea分支合并

以下二选1即可完成分支合并建议第一种简单有效 Idea合并方式 切换到被合并的分支&#xff0c;如我想把0701的内容合并到dev&#xff0c;切换到dev分支&#xff0c;然后再点击merge然后选择要合并的分支&#xff0c;即可,此时git上的代码没有更新只是把代码合到本地需要pull才…

ELK的日志解决方案

ELK的日志解决方案 一、ELK 介绍 ELK是一个流行的日志解决方案&#xff0c;它由三个开源工具组成&#xff1a;Elasticsearch、Logstash和Kibana。下面是这些工具的简单介绍以及它们在日志解决方案中的作用&#xff1a; Elasticsearch&#xff1a;Elasticsearch是一个分布式的搜…

设置webstorm和idea符合Alibaba规范

只格式化自己更改的代码 ctrlShiftAltL 插件建议 Alibaba Java Coding Guidelines&#xff08;新版本的idea不支持&#xff0c;有其他同名的非官方版可代替&#xff09;&#xff0c;使用方法在此不赘述 1、设置webstorm 包含 设置两个空格缩进&#xff0c;去掉行尾分号&#…

IDEA加载阿里Java规范插件

IDEA加载阿里巴巴Java开发手册插件&#xff0c;在写代码的时候会自动扫描代码规范。 1、打开Settings 2、打开Plugins 3、搜索Alibaba Java Code Guidelines&#xff08;XenoAmess TPM&#xff09;插件&#xff0c;点击Install进行安装&#xff0c;然后重启IDE生效。 4、鼠标右…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含pytho、JS工程源码)+数据集+模型(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境微信开发者工具OneNET云平台 相关其它博客工程源代码下载其它资料下载 前言 本项目基于Keras框架&#xff0c;引入CNN进行模型训练&#xff0c;采用Dropout梯度…

uniapp 打包H5页面时候清除手机缓存问题

最近遇到一个情况&#xff1a; uniapp 写了一个H5 页面&#xff0c;挂在一个小程序上面&#xff0c;但是每次更新代码&#xff0c;新增新功能&#xff0c;总是有的用户看到的还是上一个版本的样式&#xff0c;前端打包的时候&#xff0c;已经在Uniapp项目的根目录下面新建了一个…

Hive数据库系列--Hive数据类型/Hive字段类型/Hive类型转换

文章目录 一、Hive数据类型1.1、数值类型1.2、字符类型1.3、日期时间类型1.4、其他类型1.5、集合数据类型1.5.1、Struct举例1.5.2、Array举例1.5.3、Map举例 二、数据类型转换2.1、隐式转换2.2、显示转换 本章主要讲解hive的数据类、字段类型。官网文档地址见https://cwiki.apa…

Java代码审计之SpEL表达式注入漏洞分析

文章目录 前言CVE-2022-22963漏洞简述环境搭建反弹shell CVE漏洞调试分析本地搭建调试分析补丁分析 总结 前言 表达式注入是 Java 安全中一类常见的能够注入命令并形成 RCE 的漏洞&#xff0c;而常见的表达式注入方式有 EL 表达式注入、SpEL 表达式注入和 OGNL 表达式注入等。…

【Docker】从零开始:17.Dockerfile基本概念

【Docker】从零开始&#xff1a;17.Dockerfile 概述1.什么是Dockerfile2.Dockerfile构建三大步骤3.Docker执行Dockerfile流程 一张图理解Dockerfile常用保留指令~FROM~~MAINTAINER~~RUN~两种格式 ~EXPOSE~~WORKDIR~~USER~~ENV~~ADD~~COPY~两种格式 ~VOLUME~~CMD~两种格式注意 ~…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…

竞赛选题 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

多人聊天Java

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…