【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]+$
是一个正则表达式,我们可以分步骤地解释它;至于没用到的就暂时不说,不然容易混淆视听:
^
: 匹配字符串的开始。当此字符位于正则表达式的开始处时,它确保模式必须从字符串的开始处匹配。- 0x: 这部分匹配字符串中的"0x"文字。
[0-9a-f]
: 这是一个字符集,它匹配任何一个在0
到9
或者a
到f
(小写)之间的字符。简单地说,它匹配任何一个十六进制字符。 +
: 表示前面的模式(在这里是[0-9a-f]
)可以出现一次或多次。$
: 匹配字符串的结束。当此字符位于正则表达式的末尾时,它确保模式必须匹配到字符串的末尾。
因此,整个正则表达式^[0-9a-f]+$
匹配的是:一个完全由十六进制字符组成的字符串。这意味着,如果一个字符串从开始到结束都是由十六进制字符组成的,那么这个正则表达式就会匹配成功。
所以,这个表达式,刚好符合咱们的需求。
为了防止误删,所以在QLineEdit
的void 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}$
:
^
: 匹配字符串的开始。0x
: 这部分匹配字符串中的"0x"文字。[0-9a-f]
: 这是一个字符集,它匹配任何一个在0
到9
或者a
到f
(小写)之间的字符。简单地说,它匹配任何一个十六进制字符。{1,3}
: 这是一个数量修饰符,它表示前面的模式(在这里是[0-9a-f]
)可以出现1到3次。$
: 匹配字符串的结束。
^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 eQString 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 eQString 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')); // 0xaabbcstr = 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(" ", ""); // 0xaabbccddeQRegExp regex("(.{2})"); // 正则表达式,匹配任意两个字符// 使用正则表达式进行替换操作,将匹配到的两个字符之间添加空格QString result = str.replace(regex, "\\1 ");ui->lineEdit->setText(result); // 0x aa bb cc dd e
结论
一个人如果没有梦想,跟无忧无虑有什么区别
。
相关文章:

【Qt】QLineEdit显示输入十六进制,位数不足时按照规则填充显示及每两个字符以空格填充
问题 在实际开发中,有时候需要对输入进行限制,一是更加合理,二是防止出现误操作。 比如: 使用Qt进行应用程序开发时,对单行编辑框QLineEdit控件,设置只可输入十六进制。 限制输入的方式常用且经典的是使用…...

GPT 中文提示词技巧:参照 OpenAI 官方教程
前言 搜了半天什么 prompt engineering 的课,最后会发现 gpt 官方其实是有 prompt 教程的。因此本文主要是学习这篇教程。 概述 - OpenAI API 部分案例是参考:根据吴恩达老师教程总结出中文版prompt教程_哔哩哔哩_bilibili up主的内容。 一、尽可能清…...

原生微信小程序将字符串生成二维码图片
weapp-qrcode.js再最后 inde.ts中的内容 // pages/qrCode/index.ts // 引入weapp-qrcode.js文件 var QRCode require(../../utils/weapp-qrcode) Page({/*** 页面的初始数据*/data: {orderNo:"",imagePath:},/*** 生命周期函数--监听页面加载*/onLoad(options:any)…...

深入理解HTTPS加密协议
在现代网络环境中,数据安全和隐私保护至关重要。HTTPS(全称为HyperText Transfer Protocol Secure)是一种用于保障互联网通信安全的加密协议,它通过在HTTP协议的基础上添加SSL/TLS层来实现对数据的加密传输。本文将详细介绍HTTPS的…...

路径规划之PRM算法
系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之A *算法 路径规划之D *算法 路径规划之PRM算法 路径规划之PRM算法 系列文章目录前言一、前期准备1.栅格地图2.采样3.路标 二、PRM算法1.起源2.流程3. 优缺点4. 实际效果 前言 之前提到的几种…...

深入理解数据在内存中是如何存储的,位移操作符如何使用(能看懂文字就能明白系列)文章超长,慢慢品尝
系列文章目录 C语言笔记专栏 能看懂文字就能明白系列 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 文章目录 系列文章目录🌈 *信念如阳光,照亮前行的每一步* 前言引子一、2进制和进制转化为什么…...

ArcGIS提示当前许可不支持影像服务器
1、问题: 在用ArcGIS上处理影像栅格数据时(比如栅格数据集裁剪、镶嵌数据集构建镶嵌线等)经常会出现。 无法启动配置 RasterComander.ImageServer <详信息 在计算机XXXXX上创建服务器对象实例失败 当前许可不支持影像服务器。 ArcGIS提示当…...

Android P 9.0 增加以太网静态IP功能
效果图 一、Settings添加以太网的配置: 1、vendor\mediatek\proprietary\packages\apps\MtkSettings\res\xml\network_and_internet.xml <com.android.settingslib.RestrictedPreferenceandroid:key"ethernet_settings"android:title"string/et…...

Android12之MediaCodec硬编解码调试手段(四十九)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…...

2.Ansible的copy模块,我最常用的模块
1. 简述 先从我自身的情况来说,我不是运维人员,并且对linux操作也不是特别熟悉,所以工作中我使用ansible基本就是在平常的自动化部署中,而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以&am…...

python程序将部分文件复制到指定目录
geotools-28.2中的lib一共有264个jar包,但我只想将部分100个左右jar包引导我的环境中,那个就需要从目录中找出想要的那100个jar,手动挑选太费时间,我简单的写了个小脚本来实现。 我将想要的jar文件名和路径存放到txt中࿰…...

5分钟教你利用服务器,打造1个 7*24H直播的直播间
最近在折腾无人直播。觉得还挺有意思,接下来就分享一下如何实现。实现后就可以给一些主流的平台直播间不间断推流,达到无人直播的效果。 前提:拥有一台服务器。最好流量是1T或者以上。直播对流量要求比较高,视频码率越大ÿ…...

卡通渲染总结《二》
关于技术的方面,一方面就是其轮廓边缘检测: 主要的方法可以被分为基于图片空间和对象空间,对象空间比图片空间会多一些立体坐标位置的信息。 轮廓类型分类 首先我们顶一下轮廓是什么,从一个视角看去如果一条边相邻的两个面其恰…...

严蔚敏数据结构p17(2.19)——p18(2.24) (c语言代码实现)
目录 2.19已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于 mink 且小于 maxk 的元素(若表中存在这样的元素)同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink 和 maxk 是给定的个参变量,它们的值可以和表…...

0007Java程序设计-ssm基于微信小程序的在线考试系统
文章目录 **摘要**目 录系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅🐧裙:776871563 摘要 网络技术的快速发展给各行各业带来了很大的突破,也给各行各业提供了一种新的管理技术,基于微信小程序的在线考试…...

php 使用多线程
fpm cli socket redis PHP多线程-阿里云开发者社区 常驻内存:op cli EasyTask: PHP常驻内存多进程任务管理器,支持定时任务(PHP resident memory multi-process task manager, supports timing tasks) 协程:swoole Swoole - PHP 协…...

基于MapBox的方法封装及调用
目录 1、初始化地图 2、单独添加瓦片 3、开启绘制方法 4、移除绘制数据 5、拾取经纬度 6、加点 7、加线 8、加面 9、更改图层顺序 10、更改实体样式 11、移除实体或图层 12、定位某个点 13、定位数组 14、锁定实体跟随视角 15、获取视窗 16、设置俯仰角 17、设…...

华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)
题目描述: 在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。现有一家Bank,它提供有若干理财产品m,风险及投资回报不同,你有N(元)进行投资,能接受的总风险值为X。 你要在可接受范围内选择最优的投资方式获得最大回报。 说明: 在虚拟游戏中…...

解决 video.js ios 播放一会行一会不行
最近用video 进行m3u8视频文件播放,但是途中遇到了 安卓和电脑端都能打开,ios有时可以播放有时播放不了 出现问题原因: ios拿到视频流前需要预加载视频,如果当前视频流还没有打开过,ios拿不到视频流的缓存,…...

排序分析(Ordination analysis)及R实现
在生态学、统计学和生物学等领域,排序分析是一种用于探索和展示数据结构的多元统计技术。这种分析方法通过将多维数据集中的样本或变量映射到低维空间,以便更容易理解和可视化数据之间的关系。排序分析常用于研究物种组成、生态系统结构等生态学和生物学…...

Tomcat主配置文件(server.xml)详解
前言 Tomcat主配置文件(server.xml)是Tomcat服务器的主要配置文件,文件位置在conf目录下,它包含了Tomcat的全局配置信息,包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…...

Python实现简单的区块链,实现共识算法、Merkle Tree(默克尔树)、冲突解决、添加交易等功能
Python实现简单的区块链 记录自己假期所学相关内容 文章中的内容,开源代码地址见文末。 文章目录 Python实现简单的区块链1、分模块实现简单的单节点区块链1.1 Transaction类1.2 DaDaMessage类1.3 Block类1.4 Dada_BlockCoin类1.5 主函数BlockChainApp类1.6 主函数…...

深入理解 Java 虚拟机(JVM)从入门到精通
目录 一、JVM内存结构1、堆(Heap)(1)特点(2)堆内存分配(3)晋升到老年代的方式(4)堆内存检验方式2、虚拟机栈(VM Stack)(1&…...

哔哩哔哩自动评论软件,其成果展示与开发流程和代码分享
先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 一、背景介绍 随着互联网的发展,哔哩哔哩作为国内最大的弹幕视频网站之一,吸引了越来越多的用户。为了更好地推广自己的作品,许多UP主希望能够通…...

Qt OpenCV 学习(一):环境搭建
对应版本 Qt 5.15.2OpenCV 3.4.9MinGW 8.1.0 32-bit 1. OpenCV 下载 确保安装 Qt 时勾选了 MinGW 编译器 本文使用 MinGW 编译好的 OpenCV 库,无需自行编译 确保下载的 MinGW 和上述安装 Qt 时勾选的 MinGW 编译器位数一致,此处均为 x86/32-bit下载地址…...

Redis——某马点评day02——商铺缓存
什么是缓存 添加Redis缓存 添加商铺缓存 Controller层中 /*** 根据id查询商铺信息* param id 商铺id* return 商铺详情数据*/GetMapping("/{id}")public Result queryShopById(PathVariable("id") Long id) {return shopService.queryById(id);} Service…...

prometheus|云原生|轻型日志收集系统loki+promtail的部署说明
一, 日志聚合的概念说明 日志------ 每一个程序,服务都应该有保留日志,日志的作用第一是记录程序运行的情况,在出错的时候能够记录错误情况,简单来说就是审计工作,例如nginx服务的日志,kuber…...

MySQL 临时数据空间不足导致SQL被killed 的问题与扩展
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内,可以解决你的问题。加群请联系 liuaustin3 ,(共1730人左右 1 2 3 4 5࿰…...

文心一言大模型应用开发入门
本文重点介绍百度智能云平台、文心一言、千帆大模型平台的基本使用与接入流程及其详细步骤。 注册文心一言 请登录文心一言官方网站 https://yiyan.baidu.com/welcome 点击登录;图示如下: 请注册文心一言账号并点击登录,图示如下࿱…...

C++新经典模板与泛型编程:SFINAE替换失败并不是一个错误
替换失败并不是一个错误(SFINAE) SFINAE是一个英文简称,全称为Substitution Failure is not an Error,翻译成中文就是“替换失败并不是一个错误”。 SFINAE可以看作C语言的一种特性或模板设计中要遵循的一个重要原则,…...