当前位置: 首页 > news >正文

【Qt】国际化(中英文翻译)——Qt语言家(Linguist)和QTranslator类的简单使用(内含完整源码)

先展示下效果


文章目录

    • 先展示下效果
  • 一、前言
  • 二、操作步骤
      • 2.1 新建一个 Qt Widgets 工程
      • 2.2 在项目文件(.pro 文件)中添加添加如下代码
      • 2.3 添加控件
      • 2.4 “更新翻译”
      • 2.5 使用Linguist(Qt 语言家)生成.qm 文件
        • 2.5.1 打开`Linguist`
        • 2.5.2 打开`.ts`文件
        • 2.5.3 添加翻译
        • 2.5.4 点击发布,生成.qm 文件
      • 2.6 将生成的`.qm`文件添加为资源文件
      • 2.7 在代码中使用翻译家QTranslator加载.qm资源文件,进行中英文切换
        • 代码关键说明:
  • 三、可能遇到的问题:
      • 3.1 Qt Creator “工具 -> 外部” 没有“语言家”菜单项

一、前言

本文代码测试环境:

编程语言构建套件IDE操作系统
C++ 11Desktop Qt 6.9.1 MSVC2022 x86_64Qt Creator 17.0.0Windows10

在这里插入图片描述

二、操作步骤

2.1 新建一个 Qt Widgets 工程

新建工程,比较基础,不再具体演示。

2.2 在项目文件(.pro 文件)中添加添加如下代码

TRANSLATIONS += \tr_toEnglish.ts     # 其它语言转换为英文tr_toChinese.ts     # 其它语言转换为中文

在 Qt 的 .pro 文件中,TRANSLATIONS 是一个用于指定项目需要处理的翻译文件(.ts 文件)的变量。它的作用是告诉 Qt 的构建工具(如 qmake、lupdate 和 lrelease)哪些翻译文件需要被处理。

2.3 添加控件

为了方便演示,我们添加两个 QLabel、一个 QComboBox控件。其中一个 QLabel 让她显示一句英文。如下图所示:
在这里插入图片描述

2.4 “更新翻译”

按照下图步骤操作,会生成两个.ts 文件,从名字可以看出这两个.ts 文件就是.pro 中的那个两个文件。

更新成功会输出类似以下内容 (ps:由于我已经点击过“更新翻译”,所以我这里显示 0 个更新,明白怎么回事就好)

2.5 使用Linguist(Qt 语言家)生成.qm 文件

2.5.1 打开Linguist

注意Linguist要使用和自己项目对应的版本。比如我的项目使用的“构建套件”是 MSVC2022,则我这里也要使用 MSVC2022 版本的Linguist。如下图所示。

Linguist刚打开时的默认界面

2.5.2 打开.ts文件

建议一次只选择一个.ts文件,翻译完一个再说另一个。

2.5.3 添加翻译

按照下图操作:

2.5.4 点击发布,生成.qm 文件

另一个.ts 文件也是如此操作,重复本章节的 2\ 3\ 4\ 步骤就好了。这样两个.ts文件就会生成两个.qm文件了。

2.6 将生成的.qm文件添加为资源文件

按照下图操作:

2.7 在代码中使用翻译家QTranslator加载.qm资源文件,进行中英文切换

MainWindow.h源码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTranslator>  // 翻译家QT_BEGIN_NAMESPACE
namespace Ui {
class CMainWindow;
}
QT_END_NAMESPACEclass CMainWindow : public QMainWindow
{Q_OBJECTpublic:CMainWindow(QWidget *parent = nullptr);~CMainWindow();protected:void changeEvent(QEvent *event) override;private slots:void on_comboBox_currentIndexChanged(int index);private:Ui::CMainWindow *ui;QTranslator m_qTrans;
};
#endif // MAINWINDOW_H

MainWindow.cpp源码如下:

#include "MainWindow.h"
#include "ui_MainWindow.h"// 构造函数:初始化主窗口
CMainWindow::CMainWindow(QWidget *parent): QMainWindow(parent)  // 调用父类QMainWindow的构造函数, ui(new Ui::CMainWindow)  // 初始化UI对象
{ui->setupUi(this);  // 加载UI布局,创建界面元素
}// 析构函数:释放资源
CMainWindow::~CMainWindow()
{delete ui;  // 释放UI对象占用的内存
}/*** @brief 重写QWidget的changeEvent方法,处理窗口的各种变化事件* @param event 事件对象,包含事件类型和相关信息** 说明:* changeEvent是Qt框架提供的虚函数,用于处理窗口的"变化事件",包括:* 1. 语言切换(QEvent::LanguageChange)* 2. 样式变化(QEvent::StyleChange)* 3. 字体变化(QEvent::FontChange)等** 这里主要用于处理语言切换事件,当程序语言发生变化时,更新UI上的文本*/
void CMainWindow::changeEvent(QEvent *event)
{// 先调用父类的changeEvent,确保基础事件处理正常QWidget::changeEvent(event);// 根据事件类型进行不同处理switch (event->type()){case QEvent::LanguageChange:// 当事件类型为"语言变化"时,重新翻译UI// retranslateUi会根据当前安装的翻译器,更新所有UI元素的文本ui->retranslateUi(this);break;default:// 其他类型事件不做额外处理break;}
}/*** @brief 组合框(下拉框)选中项变化时的槽函数* @param index 选中项的索引(0为中文,1为英文)** 功能:根据选中的索引加载对应的翻译文件,并安装翻译器* 安装翻译器后,Qt会自动发送QEvent::LanguageChange事件,触发上面的changeEvent方法* @note* - QTranslator::load()方法的返回值被标记为[[nodiscard]]属性,必须处理返回值,* 否则编译器会报警告:“C4834: 放弃具有 [[nodiscard]] 属性的函数的返回值”*/
void CMainWindow::on_comboBox_currentIndexChanged(int index)
{bool loadSuccess = false; // 用于接收load()的返回值if (0 == index){qDebug() << "下标为0,切换为中文";// 加载中文翻译文件loadSuccess = m_qTrans.load(":/trans/tr_toChinese.qm");}else{qDebug() << "下标为1,切换为英文";// 加载英文翻译文件loadSuccess = m_qTrans.load(":/trans/tr_toEnglish.qm");}// 检查加载结果if (!loadSuccess){qWarning() << "翻译文件加载失败!请检查文件路径是否正确";return; // 加载失败则不安装翻译器}// 安装翻译器到应用程序,使翻译生效qApp->installTranslator(&m_qTrans);	// qApp 是 Qt 提供的全局宏,指向唯一的 QApplication 实例
}
代码关键说明:
  1. changeEvent的作用:
    它是 Qt 框架用于处理 “窗口状态变化” 的事件回调函数,当窗口的某些基础属性(如语言、样式、字体等)发生变化时,Qt 会自动调用这个函数。

  2. 语言切换的完整流程:
    2.1 用户在下拉框选择语言(触发on_comboBox_currentIndexChanged
    2.2 程序加载对应的翻译文件并通过installTranslator安装
    2.3 安装翻译器后,Qt 会自动向所有窗口发送QEvent::LanguageChange事件
    2.4 窗口的changeEvent捕获到这个事件,调用ui->retranslateUi(this)更新所有 UI 文本(按钮、标签等的文字)

  3. retranslateUi方法的作用:
    这个函数是 Qt 的 uic 工具自动生成的(在 ui_MainWindow.h 中),它会根据当前翻译器,重新设置所有 UI 元素的文本内容,实现界面文字的动态切换。
    在这里插入图片描述

名词解释:
uic:即User Interface Compiler,是一个用于将.ui文件转换为C++代码的工具

三、可能遇到的问题:

3.1 Qt Creator “工具 -> 外部” 没有“语言家”菜单项

参考:

  • Qt createor 的外部工具没有语言家菜单项
  • https://blog.csdn.net/weixin_44733606/article/details/144618164
  • Qt Creator添加外部工具

如果还是不行,不要使用链接中说的那些符号什么的。(比如:%{CurrentDocument:Project:QT_INSTALL_BINS}\lupdate),直接写绝对路径。

比如我本地环境 lupdate.exe的绝对路径是:C:\Qt\6.9.1\msvc2022_64\bin\lupdate.exe

其实就是添加外部工具:

http://www.dtcms.com/a/364397.html

相关文章:

  • el-tree 点击父节点无效,只能选中子节点
  • 存算一体:重构AI计算的革命性技术(3)
  • 2025 大数据时代值得考的证书排名前八​
  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(上)
  • 分布式AI算力系统番外篇-----超体的现实《星核》
  • 2025版基于springboot的电影购票管理系统
  • Linux_网络基础
  • Uniapp中进行微信小程序头像和昵称的更改
  • Jenkins 可观测最佳实践
  • Flutter Android真机器调式,虚拟机调试以及在Vscode中开发Flutter应用
  • 【Linux操作系统】简学深悟启示录:进程控制
  • unity中的交互控制脚本
  • 如何选择适合企业的海外智能客服系统:6 大核心维度 + 实战选型指南
  • 【STL源码剖析】从源码看 deque :拆解双端队列的底层实现与核心逻辑
  • 用友T3、T6/U8批量作废凭证
  • 从数据生成到不确定性估计:用 LSTM + 贝叶斯优化实现时间序列多步预测
  • 基于SpringBoot的旅游管理系统
  • 【大前端】React 使用 Redux 实现组件通信的 Demo 示例
  • React实现点击按钮复制操作【navigator.clipboard与document.execCommand】
  • 基于单片机PWM信号发生器系统Proteus仿真(含全部资料)
  • 平衡车 - 电机调速
  • 基于单片机车内换气温度检测空气质量检测系统Proteus仿真(含全部资料)
  • 单片机点灯
  • Linux 网络编程中核心函数`recv`。
  • zynq 开发系列 新手入门:GPIO 连接 MIO 控制 LED 闪烁(SDK 端代码编写详解)
  • Spring Boot 实现数据库表变更监听的 Redis 消息队列方案
  • 单片机控制两只直流电机正反转C语言
  • 变频器实习DAY42 VF与IF电机启动方式
  • Excel 电影名匹配图片路径教程:自动查找并写入系统全路径
  • wpf 自定义控件,只能输入小数点,并且能控制小数点位数