優秀的國際化應用應支援:啟動時載入預設/上次語言、運行時透過選單即時切換語言、介面文字即時更新。

tr() 中changeEvent:攔截 QEvent::LanguageChange,調用 translateUI() 重新套用文字QTranslator 載入 .qm 檔並安裝至 qApptypedef enum { UI_ZH, UI_EN } LANGUAGE;
Q_DECLARE_METATYPE(LANGUAGE) // 讓自訂型別可用於 QVariant
qRegisterMetaType("LANGUAGE"); // 讓自訂型別可用於訊號槽
void SettingDialog::onIndexChanged() {
LANGUAGE lang = language_combo_box->currentData().value();
emit switchLanguage(lang);
}
void SettingDialog::changeEvent(QEvent *event) {
if (event->type() == QEvent::LanguageChange)
translateUI(); // 重新套用所有 tr() 文字
else
QDialog::changeEvent(event);
}
void MainWidget::switchLanguage(LANGUAGE language) {
QString qmPath;
switch (language) {
case UI_ZH: qmPath = ":/qm/main_widget_zh"; break;
case UI_EN: qmPath = ":/qm/main_widget_en"; break;
}
if (current_language != language) {
current_language = language;
translator->load(qmPath);
Util::writeInit("./user.ini", "language", QString::number(language));
}
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QTranslator translator;
QString suffix = "zh";
LANGUAGE lang = UI_ZH;
// 讀取儲存設定
QString value;
if (Util::readInit("./user.ini", "language", value)) {
lang = (LANGUAGE)value.toInt();
if (lang == UI_EN) suffix = "en";
}
translator.load(":/qm/main_widget_" + suffix);
app.installTranslator(&translator);
// ... 建立主視窗並傳遞 translator ...
}
.pro 增加 TRANSLATIONS = Resource/main_widget_zh.ts Resource/main_widget_en.ts.ts.ts 進行翻譯.qm 二進位翻譯檔

QTranslator translator;
translator.load(":/qm/main_widget_zh");
app.installTranslator(&translator);
關鍵點:
changeEvent中的QEvent::LanguageChange會在installTranslator或removeTranslator後自動發送,確保所有視窗同步更新。