Qt实现语言切换的完整方案

news2025/4/25 10:11:33

在Qt中实现语言动态切换需要以下几个关键步骤,我将提供一个完整的实现方案:

一、准备工作

  1. 在代码中使用tr()标记所有需要翻译的字符串

    cpp

    button->setText(tr("Submit"));
  2. 创建翻译文件

    • 在.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_OBJECT

public:
    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();
}

四、说明

  1. 翻译文件生成流程

    bash

    lupdate myproject.pro  # 生成.ts文件
    linguist translations/myapp_zh_CN.ts  # 使用Qt Linguist翻译
    lrelease myproject.pro  # 生成.qm文件
  2. 资源文件(.qrc)配置

    xml

    <RCC>
        <qresource prefix="/">
            <file>translations/myapp_zh_CN.qm</file>
            <file>translations/myapp_en_US.qm</file>
        </qresource>
    </RCC>
  3. 注意事项

    • 所有需要翻译的字符串必须用tr()包裹

    • 语言切换后,需要手动更新动态生成的文本

    • 对于UI文件中的文本,retranslateUi()会自动处理

    • 考虑不同语言文本长度对布局的影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优选算法第十讲:字符串

优选算法第十讲&#xff1a;字符串 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 2.最长回文子串 3.二进制求和 4.字符串相乘

【扣子Coze 智能体案例四】五行八卦占卜智能体

目录 一、意图识别 二、时间格式转换 三、八字转换 四、八字提取 五、八字提取2 六、数据汇总 七、统计五行占比 八、雷达图生成 九、表格生成 十、AI占卜 十一、结束节点 一、意图识别 用户输入的信息包含各种时间格式的年月日时 用户输入的信息包含天干地支八字…

5.学习笔记-SpringMVC(P61-P70)

SpringMVC-SSM整合-接口测试 (1)业务层接口使用junit接口做测试 (2)表现层用postman做接口测试 (3)事务处理— 1&#xff09;在SpringConfig.java&#xff0c;开启注解&#xff0c;是事务驱动 2&#xff09;配置事务管理器&#xff08;因为事务管理器是要配置数据源对象&…

【专题刷题】二分查找(一):深度解刨二分思想和二分模板

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

硬核解析!电动汽车能耗预测与续驶里程的关键技术研究

引言 随着电动汽车的普及,续航里程和能耗表现成为用户关注的核心痛点。然而,表显续航与实际续航的差异、低温环境下的电量衰减等问题始终困扰着消费者。本文基于《电动汽车能耗预测与续驶里程研究》的实验成果,深入剖析电动汽车能耗预测的核心模型、多环境测试方法及续航里…

【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: …

详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别

详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别 下面我们详细拆解 Qt 中用于线程同步的两个核心类&#xff1a;QMutex 和 QMutexLocker。 &#x1f9f1; 一、什么是 QMutex&#xff1f; QMutex 是 Qt 中的互斥锁&#xff08;mutex&#xff09;类&#xff0c;用于防止多个…

PCB 过孔铜厚的深入指南

***前言&#xff1a;在上一期的文章中介绍了PCB制造的工艺流程&#xff0c;但仍然想在过孔的铜厚和PCB的过孔厚径比两个方面再深入介绍。 PCB铜厚的定义 电路中铜的厚度以盎司(oz)**表示。那么&#xff0c;为什么用重量单位来表示厚度呢? 盎司(oz)的定义 将1盎司(28.35 克)的铜…

Spring Security认证流程

认证是Spring Security的核心功能之一&#xff0c;Spring Security所提供的认证可以更好地保护系统的隐私数据与资源&#xff0c;只有当用户的身份合法后方可访问该系统的资源。Spring Security提供了默认的认证相关配置&#xff0c;开发者也可以根据自己实际的环境进行自定义身…

TXPOLARITY/RXPOLARITY设置

TXPOLARITY/RXPOLARITY&#xff1a;该端口用来反向输出数据的极性。 0&#xff1a;表示不反向。TXP是正&#xff0c;TXN是负&#xff1b; 1&#xff1a;标识反向。TXP是负&#xff0c;TXN是正&#xff1b; 如下图所示&#xff1a;

2026届华为海思秋暑期IC实习秋招笔试真题(2025.04.23更新)

今天给大家分享下华为海思2025.04.23号最新IC笔试真题。 华为海思IC前端中后端(COT&XPU)岗位笔试机考题 更多华为海思数字IC岗秋招实习笔试真题&#xff0c;可以私信小编。 数字后端培训实战项目六大典型后端实现案例 秒杀数字后端实现中clock gating使能端setup viola…

优考试V4.20机构版【可注册】

优考试V4.20机构版&#xff0c;可通过注册机完美激活。 优考试机构版‌是一个功能强大的在线考试系统&#xff0c;适用于各种 考试场景&#xff0c;包括在线考试、培训、学习等多种用途。以下是优考试机构版的主要功能和特点&#xff1a; ‌多层级管理‌&#xff1a;优考试机…

携国家图书馆文创打造AI创意短片,阿里妈妈AIGC能力面向商家开放

在4月23日“世界读书日”之际&#xff0c;阿里妈妈联合国家图书馆文创正式发布了三条AI创意视频。 该系列视频以“千年文脉典籍奇谈”为主题&#xff0c;借助阿里妈妈的AIGC能力&#xff0c;以AI链接古今&#xff0c;打开阅读典籍新方式&#xff0c;引起不少人强烈兴趣。据悉&…

MMsegmentation第一弹-(认识与安装)

前言 在刚接触MMsegmentation的时候&#xff0c;我是怎么看都看不明白&#xff0c;那个过程实在是太痛苦了&#xff0c;所以我当时就想着一定要把这个写成文章&#xff0c;希望后来者能很轻松的就上手。该系列文章不涉及框架的底层原理&#xff0c;仅以一个使用者的身份带领读…

React19源码阅读之commitRoot

commitRoot入口 在finishConcurrentRender函数&#xff0c;commitRootWhenReady函数&#xff0c;commitRoot函数。 commitRoot流程图 commitRoot函数 commitRoot 函数是 React 渲染流程中用于提交根节点的关键函数。它的主要作用是设置相关的优先级和状态&#xff0c;然后调…

目标检测:视觉系统中的CNN-Transformer融合网络

一、背景 无人机&#xff08;UAVs&#xff09;在城市自动巡逻中发挥着重要作用&#xff0c;但它们在图像识别方面面临挑战&#xff0c;尤其是小目标检测和目标遮挡问题。此外&#xff0c;无人机的高速飞行要求检测系统具备实时处理能力。 为解决这些问题&#xff0c;我们提出…

Turso:一个基于 libSQL的分布式数据库

Turso 是一个完全托管的数据库平台&#xff0c;支持在一个组织中创建高达数十万个数据库&#xff0c;并且可以复制到任何地点&#xff0c;包括你自己的服务器&#xff0c;以实现微秒级的访问延迟。你可以通过Turso CLI&#xff08;命令行界面&#xff09;管理群组、数据库和API…

深度学习前沿 | TransNeXt:仿生聚合注意力引领视觉感知新时代

目录 1. 引言 2. 背景与挑战 3. TransNeXt 核心创新 3.1 像素聚合注意力&#xff08;PAA&#xff09; 3.2 长度缩放余弦注意力&#xff08;LSCA&#xff09; 3.3 卷积 GLU&#xff08;ConvGLU&#xff09; 4. 模型架构详解 5. 实验与性能评估 5.1 图像分类&#xff08;I…

C语言-函数-1

以下是我初学C语言的笔记记录&#xff0c;欢迎在评论区留言补充 一&#xff0c;函数分为几类 * 函数分为两类&#xff1a; 一类是库函数&#xff1b;一类是自定义函数 * 库函数&#xff1a; 系统自己带的&#xff0c;在使用时候&#xff0c;要用到头文件&#xff1b; 查询库函…

openwrt作旁路由时的几个常见问题 openwrt作为旁路由配置zerotier 图文讲解

1 先看openwrt时间&#xff0c;一定要保证时间和浏览器和服务器是一致的&#xff0c;不然无法更新 2 openwrt设置旁路由前先测试下&#xff0c;路由器能否ping通主路由&#xff0c;是否能够连接外网&#xff0c;好多旁路由设置完了&#xff0c;发现还不能远程好多就是旁路由本…