最直接安全的数值转字符串方式是qstring::number(),它专为此设计,支持进制、精度等控制且不依赖locale;错误用法qstring(123)会将整数当指针导致崩溃。

QString::number() 是最直接的转换方式
Qt 官方推荐且最安全的做法就是用 QString::number(),它专为数值转字符串设计,支持进制、精度、填充等控制,不依赖 locale,也不触发隐式构造或临时对象开销。
常见错误是试图用 QString 构造函数直接传 int(比如 QString(123)),这会调用 QString(const QChar *) 重载,把整数当指针地址解释,结果是崩溃或乱码。
-
QString::number(42)→"42" -
QString::number(-17, 16)→"-11"(注意:负数十六进制仍带负号,不是补码表示) -
QString::number(3.14159, 'f', 2)→"3.14"(浮点数也支持)
qDebug()
在调试输出中写 qDebug() 看似“转成了字符串”,但这只是 <code>qDebug 内部做的临时格式化,用于打印,**不会生成可用的 QString 对象**。想存下来或传给 UI 控件(比如 QLabel::setText()),必须显式调用 QString::number() 或其他构造方式。
容易踩的坑:有人在信号槽里写 label->setText(QString(42)),以为能工作——实际是未定义行为,因为 QString(int) 构造函数接收的是 QChar 数量,不是数值本身。
立即学习“C++免费学习笔记(深入)”;
toStdString().c_str() 这条路走不通
有些 C++ 老手习惯先转 std::string 再转 Qt 字符串,但在 Qt 中:QString::number(x).toStdString() 是单向导出,反过来用 QString(str.c_str()) 并不能把 C 字符串“还原”成数字含义——它只是按 UTF-8 解码,和原始 int 已无关系。
更危险的是:如果中间用了 std::to_string() 再构造 QString,虽然能跑通,但多了一次内存拷贝、一次编码转换(std::string 是窄字符,Qt 默认用 UTF-16),纯属绕远路,还可能在非 ASCII locale 下出错。
- ✅ 推荐:
QString::number(value) - ❌ 避免:
QString(std::to_string(value).c_str()) - ❌ 避免:
QString("%1").arg(value)(arg()是格式化用的,小题大做,性能差)
嵌入插件时要注意隐式依赖和构建配置
如果你在 Qt 插件(如 QDesignerWidgetPlugin 或自定义 QObject 插件)里做 int 转 QString,重点不是转换逻辑本身,而是确保插件工程链接了 core 模块(QT += core),否则 QString::number() 会报 undefined reference。
另一个易忽略点:插件若跨 Qt 版本(比如编译用 Qt 5.15,运行在 Qt 6.5),QString 的二进制布局已变,但 number() 这种静态函数接口保持兼容,所以只要头文件和链接库版本一致,就没事;但如果手写 reinterpret_cast 或直接操作 QString 内存,那就彻底不可靠了。
复杂点往往不在怎么转,而在于你是否清楚自己写的代码是在插件初始化阶段、UI 构建阶段,还是事件响应阶段——这些上下文决定了能否安全调用 Qt 的全局状态(比如当前 QApplication 的 locale 设置),而 QString::number() 是纯函数式,完全不受影响。










