注:本文是自己平时学习整理的资料,方便自己查阅,可能存在问题或知识涵盖不全,仅供参考。

一、需求分析及存在问题

需要将一个整型的数据转换为固定长度的字符串

数据库的字段如下:

我要获取右边列的数据(其数据类型为int)并在页面展示为4位字符串,目前是直接把int转为QString后显示的,可以看到只有3位。

二、所用方法

1.具体实现

QStringLiteral(%1).arg(原始数值,最小宽度,进制,填充字符)

QStringLiteral("%1").arg(nNameID, 4, 10, QChar('0'))

2.方法解释

2.1 核心作用

将整数类型的名称 ID(nNameID)格式化为一个固定 4 位的十进制数字字符串,若武器 ID 的位数不足 4 位,则在其左侧用字符 '0' 进行补全(即补零填充)。

比如:

  • 若 nNameID = 12,格式化后结果为“0012”;
  • 若 nNameID = 123,格式化后结果为“0123”;
  • 若 nNameID = 1234,格式化后结果为“1234”;
  • 若 nNameID = 12345,格式化后结果为“12345”;

2.2 逐部分拆解

  • QStringLiteral:Qt 提供的字符串字面量宏,作用是编译期就将 C 风格字符串(这里是“%1”)直接构造为 Qt 的 QString 对象,而非运行时动态构造。相比于直接写QString("%1"),它能减少运行时内存开销、提高程序执行效率,时Qt中推荐的字符串字面量创建方式(尤其适用于字符串)。
  • %1:这是 QString 的占位符,用于标记后续需要被替换的位置。%1表示第一个待替换参数,若有多个参数,可依次使用%2、%3……等。这里的%1会被后续 arg() 方法传入的格式化后的数据替换。
  • arg(nNameID, 4, 10, QChar('0')):这是 QString 的重载 arg() 方法(专门用于数值格式化的重载版本),四个参数各自有明确含义,缺一不可(按参数顺序解析):
    参数位置参数值参数含义
    第 1 个nNameID待格式化的原始数值(这里是名称 ID,整数类型,如 int/long 等)。
    第 2 个4最小宽度(minimum width):指定格式化后的字符串至少要占用 4 个字符长度。若原始数值转换后的字符串长度不足 4 位,会用填充字符补全;若超过 4 位,不会截断,完整保留。
    第 3 个10进制(base):指定原始数值的转换进制,这里 10 表示十进制(常用进制还有 2 = 二进制、8 = 八进制、16 = 十六进制)。
    第 4 个QChar('0')填充字符(fill character):当原始数值转换后的字符串长度不足最小宽度(4 位)时,用于补全空缺位置的字符,这里指定用字符 '0' 填充(默认填充字符是空格)。

2.3 补充说明

  • 填充方向:该arg()重载版本默认左填充(即不足位数时,填充字符加在原始数字的左侧),这也是补零格式化(如固定 4 位、6 位编号)的常用方式。
  • 类型兼容性:nNameID可以是任意整数类型(int、uint、long long 等),Qt 会自动进行类型适配转换。

3.和直接使用QString的差异

对比维度QStringLiteral("%1")直接使用 QString("%1")
创建时机编译阶段(程序编译时已完成字符串构造)运行阶段(程序执行到该行代码时才动态创建)
底层原理1. 编译期将 C 风格字符串 "%1" 直接转换为 QString 内部的 Unicode 数据格式;2. 字符串数据会被存储在程序的只读数据段(静态存储区),无需运行时动态分配堆内存;3. 构造 QString 时直接引用只读数据段的已有数据,无拷贝操作。1. 运行时先识别 C 风格字符串 "%1"(存储在栈 / 只读段);2. 动态在堆内存中分配空间,用于存储 QString 所需的 Unicode 格式数据;3. 将 C 风格字符串的内容从原存储位置拷贝到堆内存的新空间中,完成 QString 构造。
内存开销几乎无额外开销:无需堆内存分配,无数据拷贝成本有明显额外开销:需要堆内存分配 / 释放,存在数据拷贝开销(即使是短字符串 "%1",也会触发 QString 的底层内存管理逻辑)
性能表现高性能:编译期完成初始化,运行时直接使用,无额外耗时性能略低:运行时动态分配 + 拷贝,存在微小但可累积的耗时(高频使用时差异明显)
数据存储位置字符串原始数据存储在只读数据段(静态区),QString 对象仅持有该数据的引用字符串数据存储在堆内存QString 对象持有堆内存的指针
可修改性若直接引用只读数据段,默认不可修改(修改时会触发 "写时拷贝",此时会动态分配堆内存拷贝数据后再修改)构造完成后可直接修改(数据存储在堆内存,修改无需额外触发拷贝)
使用限制仅支持常量字符串字面量(如 "abc""%1" 等编译期已知的固定字符串),不支持变量(如 char* str = "test"; QStringLiteral(str); 无效)支持常量字符串字面量、变量字符串(如 char* str = "test"; QString(str); 有效),无输入限制

三、实现效果

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐