Qt實現語言切換的完整方案

在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_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();
}

四、說明

  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.pswp.cn/bicheng/78413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78413.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試中被問到mybatis與jdbc有什么區別怎么辦

1. 核心區別 維度JDBCMyBatis抽象層級底層API&#xff0c;直接操作數據庫高層持久層框架&#xff0c;封裝JDBC細節代碼量需要手動編寫大量樣板代碼&#xff08;連接、異常處理等&#xff09;通過配置和映射減少冗余代碼SQL管理SQL嵌入Java代碼&#xff0c;維護困難SQL與Java代…

用于協同顯著目標檢測的小組協作學習 2021 GCoNet(總結)

摘要 一 介紹 問題一&#xff1a;以往的研究嘗試利用相關圖像之間的一致性&#xff0c;通過探索不同的共享線索[12, 13, 14]或語義連接[15, 16, 17]&#xff0c;來助力圖像組內的共同顯著目標檢測&#xff08;CoSOD&#xff09;&#xff0c;什么意思&#xff1f; 一方面是探…

OpenCV 圖形API(62)特征檢測-----在圖像中查找最顯著的角點函數goodFeaturesToTrack()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 確定圖像上的強角點。 該函數在圖像或指定的圖像區域內找到最顯著的角點&#xff0c;如文獻[240]中所述。 函數使用 cornerMinEigenVal 或 cor…

MySQL引擎分類與選擇、SQL更新底層實現、分庫分表、讀寫分離、主從復制 - 面試實戰

MySQL引擎分類與選擇、SQL更新底層實現、分庫分表、讀寫分離、主從復制 - 面試實戰 故事背景&#xff1a; 今天&#xff0c;我們模擬一場互聯網大廠Java求職者的面試場景。面試官將針對MySQL的核心技術點進行提問&#xff0c;涵蓋MySQL引擎分類與選擇、SQL更新底層實現、分庫…

如何確保微型導軌的質量穩定?

微型導軌在精密機械中扮演著至關重要的角色&#xff0c;它們不僅影響設備的性能&#xff0c;還決定了產品的壽命。那么&#xff0c;如何通過一些關鍵步驟來提高微型導軌的穩定性呢&#xff1f; 1、嚴格篩選供應商&#xff1a;選擇具備高品質保證能力的供應商&#xff0c;確保原…

Golang編程拒絕類型不安全

簡介 在 Go 中&#xff0c;標準庫提供了多種容器類型&#xff0c;如 list、ring、heap、sync.Pool 和 sync.Map。然而&#xff0c;這些容器默認是類型不安全的&#xff0c;即它們可以接受任何類型的值&#xff0c;這可能導致運行時錯誤。為了提升代碼的類型安全性和可維護性&am…

什么是 JSON?學習JSON有什么用?在springboot項目里如何實現JSON的序列化和反序列化?

作為一個學習Javaweb的新手&#xff0c;理解JSON的序列化和反序列化非常重要&#xff0c;因為它在現代Web開發&#xff0c;特別是Spring Boot中無處不在。 什么是 JSON&#xff1f; 首先&#xff0c;我們簡單了解一下JSON (JavaScript Object Notation)。 JSON 是一種輕量級的…

iOS/Android 使用 C++ 跨平臺模塊時的內存與生命周期管理

在移動應用開發領域,跨平臺開發已經成為一種不可忽視的趨勢。隨著智能手機市場的持續擴張,開發者需要同時滿足iOS和Android兩大主流平臺的需求,而這往往意味著重復的工作量和高昂的維護成本。跨平臺開發的目標在于通過一套代碼庫實現多平臺的支持,從而降低開發成本、加速產…

【AAudio】A2dp sink創建音頻軌道的源碼流程分析

一、AAudio概述 AAudio 是 Android 8.0(API 級別 26)引入的 C/C++ 原生音頻 API,專為需要低延遲、高性能音頻處理的應用設計,尤其適用于實時音頻應用(如音頻合成器、音樂制作工具、游戲音效等)。 1.1 主要特點 低延遲:通過減少音頻數據在內核與用戶空間之間的拷貝,直…

Spring中配置 Bean 的兩種方式:XML 配置 和 Java 配置類

在 Spring 框架中,配置 Bean 的方式主要有兩種:XML 配置 和 Java 配置類。這兩種方式都可以實現將對象注冊到 Spring 容器中,并通過依賴注入進行管理。本文將詳細介紹這兩種配置方式的步驟,并提供相應的代碼示例。 1. 使用 XML 配置的方式 步驟 創建 Spring 配置文件 創建…

海之淀攻略

家長要做的功課 家長可根據孩子情況&#xff0c;需要做好以下功課&#xff1a; 未讀小學的家長&#xff1a;了解小學小升初派位初中校額到校在讀小學的家長&#xff1a;了解小升初派位初中校額到校在讀初中的家長&#xff1a;了解初中校額到校 越是高年級的家長&#xff0c;…

BUUCTF-[GWCTF 2019]re3

[GWCTF 2019]re3 查殼&#xff0c;64位無殼 然后進去發現主函數也比較簡單&#xff0c;主要是一個長度校驗&#xff0c;然后有一個mprotect函數&#xff0c;說明應該又是Smc&#xff0c;然后我們用腳本還原sub_402219函數處的代碼 import idc addr0x00402219 size224 for …

sql server 開啟cdc報事務正在執行

今天開啟數據庫cdc 功能的時候提示&#xff1a;一個dbrole 的存儲過程&#xff0c;rolemember cdc db_ower, &#xff0c;有事務正在進行&#xff0c;執行失敗。 執行多次仍然如此&#xff0c;開啟cdc的存儲過程是sys.sp_cdc_enable_db;查詢了一下網絡&#xff0c;給出的方…

2025年GPLT團體程序設計天梯賽L1-L2

目錄 1.珍惜生命 2.偷感好重 3.高溫補貼 4.零頭就抹了吧 5.這是字符串題 6.這不是字符串題 7.大冪數?編輯 8.現代戰爭?編輯 9.算式拆解 10.三點共線 11.胖達的山頭 12.被n整除的n位數 1.珍惜生命 【解析】直接輸出即可 #include<bits/stdc.h> using namespace…

promethus基礎

1.下載prometheus并解壓 主要配置prometheus.yml文件 在scrape_configs配置項下添加配置(hadoop202是主機名)&#xff1a; scrape_configs: job_name: ‘prometheus’ static_configs: targets: [‘hadoop202:9090’] 添加 PushGateway 監控配置 job_name: ‘pushgateway’…

緩存與數據庫數據一致性:旁路緩存、讀寫穿透和異步寫入模式解析

旁路緩存模式、讀寫穿透模式和異步緩存寫入模式是三種常見的緩存使用模式&#xff0c;以下是對三種經典緩存使用模式在緩存與數據庫數據一致性方面更全面的分析&#xff1a; 一、旁路緩存模式&#xff08;Cache - Aside Pattern&#xff09; 1.數據讀取流程 應用程序首先向緩…

【ESP32S3】 下載時遇到 libusb_open() failed 解決方案

之前寫過一篇 《VSCode 開發環境搭建》 的文章&#xff0c;很多小伙伴反饋說在下載固件或者配置的時候會報錯&#xff0c;提示大多是 libusb_open() failed ...... &#xff1a; 這其實是由于 USB 驅動不正確導致的&#xff0c;準確來說應該是與 ESP-IDF 中內置的 OpenOCD 需要…

ISCTF2024-misc(部分)

前言 之前寫的&#xff0c;一直沒發&#xff0c;留個記錄吧&#xff0c;萬一哪天記錄掉了起碼在csdn有個念想 1.少女的秘密花園 打開是個圖片 隨波逐流binwalk一下分離得到一個zip&#xff0c;解壓得到base_misc發現是zip 爆破得到密碼 解壓得到一個txt&#xff0c;將里面的…

word內容使用python替換

擁有一個固定的word文件&#xff0c;類似模板 比如寫一個測試計劃&#xff0c;大多數內容都是通用&#xff0c;只需要改改軟件名稱&#xff0c;人員等等&#xff0c;數量多起來的情況下就可以使用代碼 # 導入 Document 類&#xff0c;用于處理 Word 文檔 from docx import Do…

py語法基礎理解

條件判斷 只有if-else等我語句,Python不支持switch語句 單if語句 if 條件語句: 條件為真時執行的內容 if-else語句 if 條件語句: 條件為真時執行的內容 else: 條件為假時執行的內容 if-elif語句 else if if 條件語句1: 條件語句1為真時執行的內容 elif 條件語句…