1. 程式人生 > >QT 國際化 動態切換中英文

QT 國際化 動態切換中英文

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(“”)就可以了。