QT 國際化 動態切換中英文
阿新 • • 發佈:2018-12-28
Qt 國際化 動態切換中英文
由於專案需要,需要在介面中實現動態切換中英文。由此記錄下實現方法。
首先
如圖所示:在右上角中有一個按鈕切換選擇中英文。
實現效果:
- 點選選單按鈕後彈出兩個子選單列表。選擇中英文。
實現方法:
- 將PushButton按鈕轉換為選單按鈕,在某些樣式中,按鈕的文字右側會生成一個小三角形。
m_menu = new QMenu;
m_English = new QAction(tr("English"),this);
m_China = new QAction(tr("中文"),this );
m_menu->addAction(m_China);
m_menu->addAction(m_English);
m_pTitleBar->m_pBtnMenu->setMenu(m_menu);
設定選單按鈕的樣式:
m_menu->setStyleSheet("QMenu{\
background-color:rgb(89,87,87);\
}\
QMenu::item{\
color: rgb(225,225,225);\
border: 1px solid rgb(60,60,60);\
background-color:rgb(89,87,87);\
padding:5px 30px 5px 5px;\
}\
QMenu::item:selected{ \
background-color:rgb(235,110,36);\
}\
QMenu::item:pressed{\
border: 1px solid rgb(60,60,61); \
background-color: rgb(220,80,6); \
}" );
//三角形按鈕不顯示
m_pTitleBar->m_pBtnMenu->setStyleSheet("QPushButton::menu-indicator{image:none};");
以上就可以實現將按鈕裝換為選單按鈕。
其次,需要將所有轉換的字型前面新增上QObject::tr();表示可翻譯。
具體操作如下:
對使用者可見的文字資訊全部使用tr()進行封裝。
在pro中新增:
TRANSLATIONS += resources/tr_zh.ts \
resources/tr_en.ts
選擇:工具->外部->Qt語言家->更新翻譯,則會生成對應的ts檔案。
- 翻譯:
使用Qt Linguist開啟要翻譯的ts檔案,對翻譯源進行相應語言的翻譯。
具體可參考:Qt Linguist介紹
- ### 釋出翻譯,生成對應的xxx.qm檔案
使用Qt Liguust翻譯完成以後,在Qt工具 –> 外部 –> Qt語言家 –> 釋出翻譯
(中文,英文都要翻譯。tr(” “)中的文字只是一個源 Sources ,程式載入翻譯檔案後,就是將源替換為翻譯後的文字,因此中英文都需要翻譯。)
新增xxx.qm檔案進資原始檔。
載入翻譯檔案:
使用QTranslator來載入生成的qm檔案,就可以讓程式顯示指定的語言。
QTranslator translator; translator.load(":/qm/main_widget_zh"); app.installTranslator(&translator);
通過以上方法就可以實現靜態的載入。也就是程式一開始執行的時候,載入相應的翻譯檔案。
動態載入的話,就需要用到上述的選單按鈕,點選後新增槽函式:
//連線槽函式
connect(m_menu, SIGNAL(triggered(QAction*)), this, SLOT(slot_MenuTriggered(QAction*)));
//槽函式實現動態切換語言,載入翻譯檔案
void MyMainWindow::slot_MenuTriggered(QAction *m_TriggeredAction)
{
static QTranslator* translator;
if (translator != NULL){
qApp->removeTranslator(translator);//如果之前載入過翻譯檔案,則移除之前的翻譯檔案。
delete translator;
translator = NULL;
}
translator = new QTranslator;
if(m_TriggeredAction->text() ==QObject::tr("中文")){
if(translator->load(":/qm/resources/tr_zh.qm")){
qApp->installTranslator(translator);
}
}else if(m_TriggeredAction->text() ==QObject::tr("English")){
if(translator->load(":/qm/resources/tr_en.qm")){
qApp->installTranslator(translator);
}
}
ReTrenslate_Ui();//再次呼叫,重新載入可見文字。實現翻譯
}
//重新載入可見文字
void MyMainWindow::ReTrenslate_Ui()
{
m_pConnectWidget->m_pBtnConnect->setText(tr("連線串列埠"));
...
...
}
該ReTrenslate_Ui()函式在MyMainWindow建構函式中的時候需要第一次呼叫。然後在動態切換語言以後需要再一次呼叫。
注意:如果語言庫qm檔案裡面的欄位一個都沒有翻譯的話,呼叫QTranslator::load()載入的話會一直返回false,我專案中是中英文切換,所以一開始我是生成了兩個qm檔案,一箇中文,一個英文的,中文語言庫是直接更新然後釋出,沒有做任何翻譯操作,所以導致載入中文語言庫一直失敗,至於原因查了半天也沒有個所以然來,如果有了解的忘告知,如果需要恢復預設的直接load(“”)就可以了。