c++ qt linguist国际化 c++ qt应用如何实现多语言支持

畫卷琴夢

畫卷琴夢

2026-03-23

555人浏览

原创

根本原因是qtranslator加载路径错误或未在qapplication构造后、show()前安装,必须显式调用installtranslator()且检查返回值;tr()仅对qobject子类成员函数内调用有效;切换语言需手动调用retranslateui()或重写changeevent;源码须utf-8无bom,字体需支持unicode。

c++ qt linguist国际化 c++ qt应用如何实现多语言支持

Qt Linguist 生成的 .qm 文件不生效,程序仍显示源码字符串

根本原因通常是 QTranslator 加载路径错误或未在 QApplication 构造后、show() 前完成安装。Qt 不会自动查找或加载 .qm,必须显式调用 installTranslator()

  • .qm 文件必须放在运行时可访问路径(如 :/translations/zh_CN.qm./translations/zh_CN.qm),不能只放在源码目录里
  • 资源文件(.qrc)中需声明 translations/ 前缀,且 QTranslator::load() 的路径参数要与之匹配(例如 ":/translations/zh_CN"
  • 必须在 QApplication 实例创建之后、任何界面控件初始化之前调用 installTranslator(),否则已创建的控件不会重译
  • 检查 QTranslator::load() 返回值——返回 false 表示路径错、格式错或语言不匹配,别忽略它

tr() 不起作用:哪些字符串能被 lupdate 提取

tr() 只对类成员函数内、继承自 QObject 的类中定义的字符串生效;裸函数、全局变量、非 QObject 类里的 tr() 调用会被 lupdate 忽略,也不会翻译。

  • 确保类声明含 Q_OBJECT 宏,且使用 moc 编译(CMake 中启用 set_property(SOURCE xxx.cpp PROPERTY AUTOMOC ON)
  • tr("Save") 可以,但 QObject::tr("Save")QCoreApplication::translate("Context", "Save") 需手动加 CONTEXT 注释才能被提取
  • 动态拼接字符串(如 tr("File ") + name + tr(" not found"))会导致上下文割裂,建议改用 tr("File %1 not found").arg(name)
  • 中文等无复数的语言也要写 tr("item")tr("items") 两行,否则切换英文时单复数逻辑失效

切换语言时界面不刷新,按钮/菜单文字不变

Qt 不会自动重绘所有控件来响应语言变更,retranslateUi() 是必需的手动步骤,尤其对 Qt Designer 生成的界面。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • 在 UI 类(如 Ui_MainWindow)中,Designer 自动生成的 setupUi() 会绑定一次文本,切换语言后必须显式调用 retranslateUi(this)
  • 若用纯代码构建界面,需自己重写 changeEvent(QEvent* e),当 e->type() == QEvent::LanguageChange 时更新所有控件文本
  • 自定义控件若含文本,也得重写 changeEvent() 并调用父类实现,否则它们永远卡在初始语言
  • 注意:调用 retranslateUi() 前,确保新 QTranslator 已安装且旧的已 removeTranslator(),否则可能混用两种语言

中文乱码、特殊字符显示为方块或问号

根源是源码文件编码与 lupdate 解析不一致,或运行时字体不支持 Unicode 字符集。

  • 所有 .cpp.h 文件必须保存为 UTF-8 无 BOM 格式(VS Code / Qt Creator 默认支持,记事本容易存成 GBK)
  • lupdate 默认按系统 locale 解析源码,Windows 上可能误判为 GBK;强制指定用 lupdate -codec UTF-8
  • Qt 6 默认使用 UTF-8,但 Qt 5 需在 main() 开头加 QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"))(仅 Qt 5)
  • 确保界面使用的字体(如 QFont)支持中文,比如 "SimSun""Noto Sans CJK SC",默认 "Sans Serif" 在某些系统上会 fallback 失败

Qt 国际化真正的难点不在配置,而在“时机”——QTranslator 安装顺序、retranslateUi() 触发时机、tr() 调用上下文,三者错一个,就卡在某个环节不动。很多人反复检查 .qm 文件是否存在,却忘了 installTranslator() 是在 QApplication 构造之后才有效的。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
视频后缀名都有哪些
视频后缀名都有哪些

视频后缀名都有avi、mpg、mpeg、rm、rmvb、flv、wmv、mov、mkv、ASF、M1V、M2V、MPE、QT、VOB、RA、RMJ、RMS、RAM、等等。更多关于视频后缀名的相关知识,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

2023.10.31

6317

17

C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

2025.08.15

1378

7

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

2025.12.05

334

15

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.18

1045

12

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

2025.09.18

583

13

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

2026.03.17

76

17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1154

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1213

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

3266

49

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.1万人学习