You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt/QString括号位置错误无编译报错,跨设备表现异常原因咨询

错误调用QString::arg引发的异常表现分析

代码实际执行逻辑

你写的代码里,arg(QString::number(distance), 'f', 1) 并没有调用你预期的、用于格式化数字的arg(double, char, int)重载,而是匹配了另一个重载:

QString QString::arg(const QString &a, int fieldWidth, QChar fillChar) const

参数的隐式转换过程如下:

  • 第一个参数QString::number(distance):正常生成对应double值的字符串(比如"1500");
  • 第二个参数'f':char类型被隐式转换为int,对应ASCII值102;
  • 第三个参数1:int类型被隐式转换为QChar,对应ASCII码为1的不可见控制字符。

这个重载的作用是:将%1替换为第一个参数的字符串,如果字符串长度小于指定的fieldWidth(这里是102),就用fillChar在字符串左侧填充。你的数字字符串长度只有4,所以会被填充98个ASCII 1的控制字符——这些就是你朋友电脑上显示的"垃圾数据"。而你的电脑上可能因为显示控件/终端对控制字符的处理逻辑不同,没有把这些字符渲染出来,才看起来正常。

为什么没有编译报错?

C++允许隐式类型转换,而Qt的arg恰好有能匹配你传入参数类型的重载:char可以自动转int,int可以自动转QChar。编译器认为这是合法的函数调用,因此不会抛出编译错误。

正确的写法

你需要调用适合格式化数字的重载,或者先正确生成带格式的字符串,两种写法都可以:

  1. 直接用double参数的arg重载:
QString distanceString = QString("%1 m").arg(distance, 'f', 1);
  1. 先通过QString::number生成带格式的字符串,再传入arg:
QString distanceString = QString("%1 m").arg(QString::number(distance, 'f', 1));

内容的提问来源于stack exchange,提问作者Kjele Hjelm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:15:40