当前位置: 首页 > news >正文

【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 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显示输入十六进制,位数不足时按照规则填充显示及每两个字符以空格填充

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

GPT 中文提示词技巧:参照 OpenAI 官方教程

前言 搜了半天什么 prompt engineering 的课&#xff0c;最后会发现 gpt 官方其实是有 prompt 教程的。因此本文主要是学习这篇教程。 概述 - OpenAI API 部分案例是参考&#xff1a;根据吴恩达老师教程总结出中文版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加密协议

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

路径规划之PRM算法

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

深入理解数据在内存中是如何存储的,位移操作符如何使用(能看懂文字就能明白系列)文章超长,慢慢品尝

系列文章目录 C语言笔记专栏 能看懂文字就能明白系列 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言引子一、2进制和进制转化为什么…...

ArcGIS提示当前许可不支持影像服务器

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

Android P 9.0 增加以太网静态IP功能

效果图 一、Settings添加以太网的配置&#xff1a; 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. 简述 先从我自身的情况来说&#xff0c;我不是运维人员&#xff0c;并且对linux操作也不是特别熟悉&#xff0c;所以工作中我使用ansible基本就是在平常的自动化部署中&#xff0c;而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以&am…...

python程序将部分文件复制到指定目录

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

5分钟教你利用服务器,打造1个 7*24H直播的直播间

最近在折腾无人直播。觉得还挺有意思&#xff0c;接下来就分享一下如何实现。实现后就可以给一些主流的平台直播间不间断推流&#xff0c;达到无人直播的效果。 前提&#xff1a;拥有一台服务器。最好流量是1T或者以上。直播对流量要求比较高&#xff0c;视频码率越大&#xff…...

卡通渲染总结《二》

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

严蔚敏数据结构p17(2.19)——p18(2.24) (c语言代码实现)

目录 2.19已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于 mink 且小于 maxk 的元素(若表中存在这样的元素&#xff09;同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink 和 maxk 是给定的个参变量,它们的值可以和表…...

0007Java程序设计-ssm基于微信小程序的在线考试系统

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

php 使用多线程

fpm cli socket redis PHP多线程-阿里云开发者社区 常驻内存&#xff1a;op cli EasyTask: PHP常驻内存多进程任务管理器&#xff0c;支持定时任务(PHP resident memory multi-process task manager, supports timing tasks) 协程&#xff1a;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视频文件播放&#xff0c;但是途中遇到了 安卓和电脑端都能打开&#xff0c;ios有时可以播放有时播放不了 出现问题原因&#xff1a; ios拿到视频流前需要预加载视频&#xff0c;如果当前视频流还没有打开过&#xff0c;ios拿不到视频流的缓存&#xff0c;…...

排序分析(Ordination analysis)及R实现

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

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

【java面试】微服务篇

【java面试】微服务篇 一、总体框架二、Springcloud&#xff08;一&#xff09;Springcloud五大组件&#xff08;二&#xff09;服务注册和发现1、Eureka2、Nacos &#xff08;三&#xff09;负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱&#xff1f;分层思维来救场&#xff01; 作者按&#xff1a; 你是不是也遇到过 BLE 多连接时&#xff0c;调试现场像网吧“掉线风暴”&#xff1f; 温度传感器连上了&#xff0c;心率带丢了&#xff1b;一边 OTA 更新&#xff0c;一边通知卡壳。…...

C#中用于控制自定义特性(Attribute)

我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] 这个 C# 属性。 在 C# 中&#xff0c;Attribute&#xff08;特性&#xff09;是一种用于向程序元素&#xff08;如类、方法、属性等&#xff09;添加元数据的机制。Attr…...