Qt实现语言切换的完整方案
在Qt中实现语言动态切换需要以下几个关键步骤,我将提供一个完整的实现方案:
一、准备工作
-
在代码中使用tr()标记所有需要翻译的字符串
cpp
button->setText(tr("Submit")); -
创建翻译文件
-
在.pro文件中添加:
qmake
TRANSLATIONS = translations/myapp_zh_CN.ts \translations/myapp_en_US.ts
-
二、核心实现类
1. 语言管理器头文件 (LanguageManager.h)
cpp
#ifndef LANGUAGEMANAGER_H
#define LANGUAGEMANAGER_H#include <QObject>
#include <QTranslator>
#include <QMap>class LanguageManager : public QObject
{Q_OBJECT
public:static LanguageManager* instance();// 可用语言列表QMap<QString, QString> availableLanguages() const;// 设置当前语言void setCurrentLanguage(const QString& languageCode);// 获取当前语言QString currentLanguage() const;signals:// 语言改变信号void languageChanged();protected:explicit LanguageManager(QObject *parent = nullptr);private:void loadTranslations();static LanguageManager* m_instance;QTranslator* m_appTranslator;QTranslator* m_qtTranslator;QString m_currentLanguage;QMap<QString, QString> m_languages; // <code, displayName>
};#endif // LANGUAGEMANAGER_H
2. 语言管理器实现 (LanguageManager.cpp)
cpp
#include "LanguageManager.h"
#include <QApplication>
#include <QDir>
#include <QDebug>
#include <QLibraryInfo>
#include <QSettings>LanguageManager* LanguageManager::m_instance = nullptr;LanguageManager::LanguageManager(QObject *parent) : QObject(parent)
{m_appTranslator = new QTranslator(this);m_qtTranslator = new QTranslator(this);// 初始化可用语言m_languages = {{"en_US", "English"},{"zh_CN", "简体中文"},{"ja_JP", "日本語"}};loadTranslations();
}LanguageManager* LanguageManager::instance()
{if (!m_instance) {m_instance = new LanguageManager(qApp);}return m_instance;
}QMap<QString, QString> LanguageManager::availableLanguages() const
{return m_languages;
}void LanguageManager::setCurrentLanguage(const QString &languageCode)
{if (!m_languages.contains(languageCode) || m_currentLanguage == languageCode) {return;}// 加载应用程序翻译bool loadSuccess = m_appTranslator->load(QString(":/translations/myapp_%1.qm").arg(languageCode));if (loadSuccess) {QApplication::installTranslator(m_appTranslator);// 加载Qt基础库翻译if (m_qtTranslator->load(QString("qt_%1").arg(languageCode), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {QApplication::installTranslator(m_qtTranslator);}m_currentLanguage = languageCode;// 保存到设置QSettings settings;settings.setValue("Language", languageCode);emit languageChanged();} else {qWarning() << "Failed to load translation for" << languageCode;}
}QString LanguageManager::currentLanguage() const
{return m_currentLanguage;
}void LanguageManager::loadTranslations()
{QSettings settings;QString lang = settings.value("Language", QLocale::system().name()).toString();// 如果设置的语言不可用,则使用系统语言或默认英语if (!m_languages.contains(lang)) {lang = m_languages.contains(QLocale::system().name()) ? QLocale::system().name() : "en_US";}setCurrentLanguage(lang);
}
三、使用示例
1. 主窗口实现
cpp
// MainWindow.h
#include <QMainWindow>
#include "LanguageManager.h"namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void changeEvent(QEvent *e) override;private slots:void onLanguageChanged();void on_actionChinese_triggered();void on_actionEnglish_triggered();private:Ui::MainWindow *ui;void updateUI();
};// MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// 连接语言改变信号connect(LanguageManager::instance(), &LanguageManager::languageChanged,this, &MainWindow::onLanguageChanged);updateUI();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::changeEvent(QEvent *e)
{QMainWindow::changeEvent(e);if (e->type() == QEvent::LanguageChange) {ui->retranslateUi(this);updateUI();}
}void MainWindow::onLanguageChanged()
{// 语言改变后的处理updateUI();
}void MainWindow::updateUI()
{// 更新非UI文件中的文本setWindowTitle(tr("Multilingual Application"));statusBar()->showMessage(tr("Current language: %1").arg(LanguageManager::instance()->currentLanguage()));
}void MainWindow::on_actionChinese_triggered()
{LanguageManager::instance()->setCurrentLanguage("zh_CN");
}void MainWindow::on_actionEnglish_triggered()
{LanguageManager::instance()->setCurrentLanguage("en_US");
}
2. 主函数初始化
cpp
#include <QApplication>
#include "MainWindow.h"
#include "LanguageManager.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);// 初始化语言管理器LanguageManager::instance()->>setCurrentLanguage("zh_CN");MainWindow w;w.show();return a.exec();
}
四、说明
-
翻译文件生成流程:
bash
lupdate myproject.pro # 生成.ts文件 linguist translations/myapp_zh_CN.ts # 使用Qt Linguist翻译 lrelease myproject.pro # 生成.qm文件 -
资源文件(.qrc)配置:
xml
<RCC><qresource prefix="/"><file>translations/myapp_zh_CN.qm</file><file>translations/myapp_en_US.qm</file></qresource> </RCC> -
注意事项:
-
所有需要翻译的字符串必须用tr()包裹
-
语言切换后,需要手动更新动态生成的文本
-
对于UI文件中的文本,retranslateUi()会自动处理
-
考虑不同语言文本长度对布局的影响
-
相关文章:
Qt实现语言切换的完整方案
在Qt中实现语言动态切换需要以下几个关键步骤,我将提供一个完整的实现方案: 一、准备工作 在代码中使用tr()标记所有需要翻译的字符串 cpp button->setText(tr("Submit")); 创建翻译文件 在.pro文件中添加: qmake TRANSLATION…...
MongoDB(docker版)备份还原
docker启动MongoDB docker run -d -p 27017:27017 --name my-mongo -v /mongodb/db:/data/db mongo备份MongoDB 使用mongodump备份数据库时,默认会将备份数据保存在当前工作目录下的dump文件夹中。 docker容器中默认备份在当前工作目录,所以此处指定当…...
优选算法第十讲:字符串
优选算法第十讲:字符串 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 2.最长回文子串 3.二进制求和 4.字符串相乘...
【扣子Coze 智能体案例四】五行八卦占卜智能体
目录 一、意图识别 二、时间格式转换 三、八字转换 四、八字提取 五、八字提取2 六、数据汇总 七、统计五行占比 八、雷达图生成 九、表格生成 十、AI占卜 十一、结束节点 一、意图识别 用户输入的信息包含各种时间格式的年月日时 用户输入的信息包含天干地支八字…...
2026《数据结构》考研复习笔记四(绪论)
绪论 前言时间复杂度分析 前言 由于先前笔者花费约一周时间将王道《数据结构》知识点大致过了一遍,圈画下来疑难知识点,有了大致的知识框架,现在的任务就是将知识点逐个理解透彻,并将leetcode刷题与课后刷题相结合。因此此后的过…...
域名 → IP 的解析全过程
Question 使用 iOS 的网络库 (比如 AFNetwoking, URLSession, Alamofire) 进行请求时, 域名具体是怎样被解析为 IP 地址的 ? Answer 一次常见的 URLSession / AFNetworking / Alamofire 请求,域名 → IP 的解析全过程 拆成自顶向下 6 个环节, 如下 1 ► 应用层&…...
C++学习:六个月从基础到就业——STL算法(三)—— 数值算法(上)
C学习:六个月从基础到就业——STL算法(三)—— 数值算法(上) 本文是我C学习之旅系列的第二十七篇技术文章,也是第二阶段"C进阶特性"的第五篇,主要介绍C STL算法库中的数值算法(上部分)。查看完整系列目录了解…...
路由与路由器
路由的概念 路由是指在网络通讯中,从源设备到目标设备路径的选择过程。路由器是实现这一过程的关键设备,它通过转发数据包来实现网络的互联。路由工作在OSI参考模型的第三层,‘网络层’。 路由器的基本原理 路由器通过维护一张路由表来决定…...
5.学习笔记-SpringMVC(P61-P70)
SpringMVC-SSM整合-接口测试 (1)业务层接口使用junit接口做测试 (2)表现层用postman做接口测试 (3)事务处理— 1)在SpringConfig.java,开启注解,是事务驱动 2)配置事务管理器(因为事务管理器是要配置数据源对象&…...
【专题刷题】二分查找(一):深度解刨二分思想和二分模板
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
硬核解析!电动汽车能耗预测与续驶里程的关键技术研究
引言 随着电动汽车的普及,续航里程和能耗表现成为用户关注的核心痛点。然而,表显续航与实际续航的差异、低温环境下的电量衰减等问题始终困扰着消费者。本文基于《电动汽车能耗预测与续驶里程研究》的实验成果,深入剖析电动汽车能耗预测的核心模型、多环境测试方法及续航里…...
【OceanBase相关】01-OceanBase数据库部署实践
文章目录 一、前言1、介绍说明2、部署方案二、部署说明1、环境准备2、软件安装2.1、安装OAT2.2、安装OCP3、软件部署三、集群管理1、MySQL租户管理四、Q&A1、OBServer 服务器重启后 observer 进程未能自动启动1.1、问题说明1.2、解决措施2、ERROR 1235 (0A000) at line 1: …...
【华为OD机试真题】428、连续字母长度 | 机试真题+思路参考+代码解析(E卷)(C++)
文章目录 一、题目题目描述输入输出样例1样例2 一、代码与思路🧠C语言思路✅C代码 一、题目 参考:https://sars2025.blog.csdn.net/article/details/139492358 题目描述 ◎ 给定一个字符串,只包含大写字母,求在包含同一字母的子串…...
C# 综合示例 库存管理系统4 classMod类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 在《库存管理系统》中使用classMod类来保存全局变量。 变量定义和含义,请详见下面的源代码: public class classMod { //数据库路径...
ZooKeeper配置优化秘籍:核心参数说明与性能优化
#作者:张桐瑞 文章目录 tickTime:Client-Server通信心跳时间initLimit:Leader-Follower初始通信时限syncLimit:Leader-Follower同步通信时限dataDir:数据文件目录clientPort:客户端连接端口服务器名称与地…...
详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别
详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别 下面我们详细拆解 Qt 中用于线程同步的两个核心类:QMutex 和 QMutexLocker。 🧱 一、什么是 QMutex? QMutex 是 Qt 中的互斥锁(mutex)类,用于防止多个…...
PCB 过孔铜厚的深入指南
***前言:在上一期的文章中介绍了PCB制造的工艺流程,但仍然想在过孔的铜厚和PCB的过孔厚径比两个方面再深入介绍。 PCB铜厚的定义 电路中铜的厚度以盎司(oz)**表示。那么,为什么用重量单位来表示厚度呢? 盎司(oz)的定义 将1盎司(28.35 克)的铜…...
【ES实战】Elasticsearch中模糊匹配类的查询
Elasticsearch中模糊匹配类的查询 文章目录 Elasticsearch中模糊匹配类的查询通配符查询前缀匹配查询正则匹配查询标准的正则操作特殊运算符操作 模糊化查询Fuzziness text类型同时配置keyword类型 Elasticsearch中模糊类查询主要有以下 Wildcard Query:通配符查询P…...
Spring Security认证流程
认证是Spring Security的核心功能之一,Spring Security所提供的认证可以更好地保护系统的隐私数据与资源,只有当用户的身份合法后方可访问该系统的资源。Spring Security提供了默认的认证相关配置,开发者也可以根据自己实际的环境进行自定义身…...
TXPOLARITY/RXPOLARITY设置
TXPOLARITY/RXPOLARITY:该端口用来反向输出数据的极性。 0:表示不反向。TXP是正,TXN是负; 1:标识反向。TXP是负,TXN是正; 如下图所示:...
2026届华为海思秋暑期IC实习秋招笔试真题(2025.04.23更新)
今天给大家分享下华为海思2025.04.23号最新IC笔试真题。 华为海思IC前端中后端(COT&XPU)岗位笔试机考题 更多华为海思数字IC岗秋招实习笔试真题,可以私信小编。 数字后端培训实战项目六大典型后端实现案例 秒杀数字后端实现中clock gating使能端setup viola…...
优考试V4.20机构版【可注册】
优考试V4.20机构版,可通过注册机完美激活。 优考试机构版是一个功能强大的在线考试系统,适用于各种 考试场景,包括在线考试、培训、学习等多种用途。以下是优考试机构版的主要功能和特点: 多层级管理:优考试机…...
携国家图书馆文创打造AI创意短片,阿里妈妈AIGC能力面向商家开放
在4月23日“世界读书日”之际,阿里妈妈联合国家图书馆文创正式发布了三条AI创意视频。 该系列视频以“千年文脉典籍奇谈”为主题,借助阿里妈妈的AIGC能力,以AI链接古今,打开阅读典籍新方式,引起不少人强烈兴趣。据悉&…...
Spark,配置hadoop集群2
1.建立新文件,编写脚本程序 在hadoop101中操作,在/root/bin下新建文件:myhadoop,输入如下内容: 2.分发执行权限 保存后退出,然后赋予脚本执行权限 [roothadoop101 ~]$ chmod x /root/bin/myhadoop 像下图…...
4.1 融合架构设计:LLM与Agent的协同工作模型
大型语言模型(Large Language Models, LLMs)与智能代理(Agent)的融合架构已成为人工智能领域推动企业智能化的核心技术。这种协同工作模型利用LLM的语言理解、推理和生成能力,为Agent提供强大的知识支持,而…...
MMsegmentation第一弹-(认识与安装)
前言 在刚接触MMsegmentation的时候,我是怎么看都看不明白,那个过程实在是太痛苦了,所以我当时就想着一定要把这个写成文章,希望后来者能很轻松的就上手。该系列文章不涉及框架的底层原理,仅以一个使用者的身份带领读…...
12.无线网络安全入门
无线网络安全入门 第一部分:无线网络基础与风险第二部分:Wi-Fi攻击方式第三部分:无线网络安全实践总结 目标: • 理解无线网络的基本原理和安全风险 • 掌握Wi-Fi常见的攻击方式 • 通过实践提升对无线网络安全的认识和防护能力 …...
React19源码阅读之commitRoot
commitRoot入口 在finishConcurrentRender函数,commitRootWhenReady函数,commitRoot函数。 commitRoot流程图 commitRoot函数 commitRoot 函数是 React 渲染流程中用于提交根节点的关键函数。它的主要作用是设置相关的优先级和状态,然后调…...
目标检测:视觉系统中的CNN-Transformer融合网络
一、背景 无人机(UAVs)在城市自动巡逻中发挥着重要作用,但它们在图像识别方面面临挑战,尤其是小目标检测和目标遮挡问题。此外,无人机的高速飞行要求检测系统具备实时处理能力。 为解决这些问题,我们提出…...
Turso:一个基于 libSQL的分布式数据库
Turso 是一个完全托管的数据库平台,支持在一个组织中创建高达数十万个数据库,并且可以复制到任何地点,包括你自己的服务器,以实现微秒级的访问延迟。你可以通过Turso CLI(命令行界面)管理群组、数据库和API…...
