如何在Qt Label与GUI Y轴刻度中正确显示长破折号(Em Dash)?
解决Qt中长破折号(Em Dash)显示为问号的问题
这种显示问题本质上要么是字符串编码没正确处理,要么是当前字体不支持该Unicode字符,下面分步骤给你解决方法:
1. 用可靠的Unicode方式构造长破折号
直接在代码里输入长破折号可能会因为源文件编码问题导致乱码,推荐用Unicode转义或者QChar构造,更稳妥:
- Em Dash(标准长破折号,Unicode编码U+2014):用
"\u2014"或者QString(QChar(0x2014)) - 如果是你提到的
─(En Dash,半长破折号,Unicode编码U+2013):用"\u2013"
比如给Label设置文本:
QLabel *myLabel = new QLabel(this); // 用Unicode转义构造 myLabel->setText("\u2014"); // 或者用QChar构造 // myLabel->setText(QString(QChar(0x2014)));
2. 给控件/轴设置支持Unicode的字体
很多系统默认字体对生僻Unicode字符覆盖不全,换一个全面支持的字体就能解决问号问题,推荐这些跨平台字体:
- Windows:Segoe UI、Arial Unicode MS
- Linux:Noto Sans、Ubuntu Font
- macOS:San Francisco、Helvetica Neue
给Label设置字体
QFont unicodeFont("Segoe UI"); myLabel->setFont(unicodeFont);
给图表Y轴设置标签字体(以Qt Charts为例)
如果是Qt Charts的轴,要给轴的标签单独设置字体:
QValueAxis *yAxis = new QValueAxis(); // 设置轴标签为长破折号 yAxis->setLabelFormat("\u2014"); // 设置支持Unicode的字体 QFont axisFont("Arial Unicode MS"); yAxis->setLabelsFont(axisFont); // 把轴绑定到图表 chart->addAxis(yAxis, Qt::AlignLeft);
如果是QCustomPlot的轴,类似操作:
customPlot->yAxis->setTickLabelFont(QFont("Noto Sans")); customPlot->yAxis->setTickLabels(QString("\u2014"));
3. 确保源文件编码正确
在Qt项目的.pro文件里添加以下配置,强制Qt用UTF-8处理源代码和字符串:
CODECFORSRC = UTF-8 CODECFORTR = UTF-8
同时,把你的源代码文件保存为UTF-8编码(Qt Creator可在「文件→编码」选项中设置)。
4. Qt Designer里的特殊处理
如果是在Designer里设置Label文本,可能会因为Designer的字体缓存或编码问题导致显示异常,建议不要直接在Designer里输入特殊字符,而是在代码里动态设置文本和字体,这样更可靠。
排查小技巧
可以先在系统的字符映射工具(Windows是「字符映射表」,macOS是「字符查看器」)里找到目标破折号,确认它的Unicode编码,然后测试用目标字体能不能正常显示这个字符——如果字体里没有这个字符,换字体就肯定能解决。
内容的提问来源于stack exchange,提问作者M.Hu
相关产品推荐
相关产品推荐

