最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt?多語(yǔ)言程序設(shè)計(jì)的實(shí)現(xiàn)

 更新時(shí)間:2022年01月10日 09:05:10   作者:zhangchuan7758  
本文主要介紹了Qt?多語(yǔ)言程序設(shè)計(jì)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)介

        有些軟件需要開(kāi)發(fā)多語(yǔ)言界面版本,如中文版和英文版,并且在軟件里可以方便地切換界面語(yǔ)言。Qt為多語(yǔ)言界面提供了很好的支持,使用Qt的一些規(guī)則和工具,可以很方便地為應(yīng)用程序開(kāi)發(fā)提供多界面支持。

        使用Qt 開(kāi)發(fā)多語(yǔ)言界面應(yīng)用程序,主要包括以下幾個(gè)步驟 。

  (1)在程序設(shè)計(jì)階段,程序代碼中每 一 個(gè)用戶(hù)可見(jiàn)的字符串都用 tr()函數(shù)封裝,以便 Qt 提取界面字符串用千生成翻譯資源文件。用 UI 設(shè)計(jì)器可視化設(shè)計(jì)窗體時(shí)統(tǒng)一用 一種語(yǔ)言,如漢語(yǔ) 。

   (2)  在項(xiàng)目配置文件 (.pro 文件)中設(shè)置需要導(dǎo)出的翻譯文件 (.ts 文件)名稱(chēng),使用lupdate工具掃描項(xiàng)目文件中需要翻譯的字符串,并生成翻譯文件 。
   (3)  使用 Qt 的 Linguist 程序打開(kāi)生成的翻譯文件,將程序中的字符串翻譯為需要的語(yǔ) 言 ,如將所有中文字符串翻譯為英文 。
  ( 4)  使用 lrelease 工具編譯翻譯好的翻譯文件, 生成更為緊湊的 ". qm" 文件 。
  ( 5)  在應(yīng)用程序中用 QTranslator 調(diào)用不同的 " .qm" 文件,實(shí)現(xiàn)不同的語(yǔ) 言界面。

1.tr()函數(shù)使用

        為了讓 Qt 能自動(dòng)提取程序中用戶(hù)可見(jiàn)的字符串,對(duì)千每個(gè)字符串都需要使用 tr()函數(shù)封裝 。tr()是 QObject 的 一個(gè)靜態(tài)函數(shù) ,在使用了 Q—OBJECT 宏定義的類(lèi)或 QObject 的子類(lèi)中,都可以直接使用 tr()函數(shù),否則需要使用 QObject::tr()進(jìn)行調(diào)用?;蛘咴陬?lèi)定義中用 Q_DECLARE_TR_FUNCTIONS 宏把 tr()函數(shù)添加到類(lèi)中之后 ,再直接調(diào)用 tr()函數(shù) 。

        tr()函數(shù)的定義 :

QString QObject::tr(const char *sourceText, const char *disambiguation=Q_NULLPTR,int  n = -1);

         其中, sourceText 是源字符串 disambiguation 是為翻譯者提供額外信息的字符串,用于對(duì) 些容易混淆的地方作說(shuō)明,內(nèi)容如下:

LabCellPos = new QLabel(tr( 當(dāng)前單元格:"), this);
QMessageBox::information(this, tr("信息"), tr( "信息提示?"), QMessageBox::Yes) ;
QString strl= tr("左右", "大約的意思");
QString str2 = tr("左右", "掌握、控制的意思");

使用 tr()函數(shù),需要注意以下事項(xiàng)。

         ① 盡量使用常量字符串 不要使用字符串變量。在 tr()函數(shù)中應(yīng)直接傳遞字符串常量,而不是用變星傳遞字符串,如下面的代碼使用了字符串變量,使用lupdate 工具提取項(xiàng)目中的 字符串時(shí) 將不能提取“不能刪除 這個(gè)字符串。

char *errorStr="不能刪除記錄";
QString str2=tr(errorStr); 

        ②使用字符串變量時(shí)需要用 Qt_TR_NOOP() 宏進(jìn)行標(biāo)記 。若要 tr()函數(shù)中使用字符串變量 需要在定義字符串的地方用 Qt_TR_NOOP() 宏進(jìn)行標(biāo)記,這在使用字符串?dāng)?shù)組時(shí)比較有用。 例如:

canst char *cities[4]={Qt_TR_NOOP("Beijing"),
    Qt_TR_NOOP(" Shanghai"), 
    Qt_TR_NOOP("Qingdao"), 
    Qt_TR_NOOP("Wuhan")}; 
 
for (int i=O; i<4; i++) 
{
    comboBox->additem(tr(cities[i])) ;
}

        ③tr()不能使用拼接的動(dòng)態(tài)字符串。 tr()不能使用拼接的動(dòng)態(tài)字符串,例如,下面的用法是錯(cuò)誤的:

LabCellPos->setText(tr("第") + QString::number(current.row())+ tr("行");

正確的方式如下:

LabCellPos->setText(tr("第%1行").arg (current.row()));

翻譯的字符串是“第%1行 ”, 然后再用 QString 的arg() 去替換占位符 "%1 "的內(nèi)容。

        ④Qt_NO_CAST_FROM_ ASCII 的作用。在一個(gè)需要翻譯為多語(yǔ)言的應(yīng)用程序中,如果編寫(xiě) 程序時(shí)忘了對(duì)某個(gè)字符串使用 tr() 函數(shù), lupdate 生成的翻譯資源文件就會(huì)遺漏這個(gè)字符串。 為了避免這種疏忽錯(cuò)誤,可以在項(xiàng)目配置文件(. pro 文件)中添加如下的定義:

DEFINES+= Qt_NO_CAST_FROM_ ASCII

        這樣在編譯時(shí),會(huì)禁止從 con char* 到QString 的隱式轉(zhuǎn)換 ,強(qiáng)制每個(gè)字符串都必須使用 tr()或 QLatinlString()封裝, 避免出現(xiàn)遺漏未翻譯的字符串。 

2.生成語(yǔ)言翻譯文件

        要生成多語(yǔ)言界面相關(guān)的翻譯文件,除了之前所說(shuō)的在對(duì)每個(gè)字符串 都使用 tr()函數(shù)封裝之外,還需要在項(xiàng)目配置文件 (.pro 文件)中使用 TRANSLATIONS 定義語(yǔ)言翻譯文件 (. ts 文件), 并使用 lupdate 工具生成語(yǔ)言翻譯文件。

        在項(xiàng)目的配置文件(*.pro)中增加如下的設(shè)置語(yǔ)句:

         TRANSLATIONS += lang_Chs.ts     \

                                           lang_Eng.ts

        在項(xiàng)目設(shè)計(jì)期間,任何時(shí)候都可以使用lupdate 工具生成或更新翻譯文件,方法是單擊Qt Creator 主菜單的 “Tools”- "External" - "Qt 語(yǔ)言家”- "Update Translations(lupdate)" 菜單項(xiàng), 若項(xiàng)目的源程序目錄下沒(méi)有l(wèi)ang_Chs.ts、lang_Eng.ts (具體名稱(chēng)可變)這兩個(gè)文件,就會(huì)自動(dòng)生成,如果 文件已經(jīng)存在,則會(huì)更新這兩個(gè)文件的內(nèi)容。

3.使用 Qt Linguist 翻譯 ts 文件

        生成的 lang_Chs.ts、lang_Eng.ts 文件內(nèi)包含了項(xiàng)目源程序和 UI 界面里的所有字符 串,使用 Qt Linguist 可以將這些字符串翻譯為需要的語(yǔ)言版本。在 Qt 安裝后的程序組里可以找到 Qt Linguist 軟件。

        lang_Chs.ts 是中文界面的翻譯文件,由于源程序的界面就是用中文設(shè)計(jì)的,所以無(wú)需再 翻譯 lang_Eng.ts 是英文翻譯文件,需要將提取的所有中文字符串翻譯為英文。

        在Linguist 軟件中打開(kāi)文件lang_Eng.ts, 當(dāng)?shù)谝淮未蜷_(kāi)一個(gè) ts 文件時(shí), Linguist 會(huì)出現(xiàn)如下圖所示的語(yǔ)言設(shè)置對(duì)話框,用千設(shè)置目標(biāo)語(yǔ)言和所在國(guó)家和地區(qū)。這個(gè)對(duì)話框也可以通過(guò) Linguist 主菜單的“編輯“一“翻譯文件設(shè)置”菜單項(xiàng)調(diào)出。lang_Eng.ts 是用于英文界面的翻譯文件,所以選擇語(yǔ)言 “English", 國(guó)家/地區(qū)可選擇 “UnitedStates”。

        打開(kāi) lang_Eng.ts 文件后的 Linguist 軟件界面如下圖所示。左側(cè)”上下文”列表里列出了項(xiàng)目中的所有窗口或類(lèi), 這個(gè)項(xiàng)目有4個(gè)窗口。”字符串”列表里列出了從項(xiàng)目的 UI 窗口和代碼文件中提取的字符串,右側(cè)“短語(yǔ)和表單”會(huì)顯 示窗口界面的預(yù)覽或字符串在源程序中出現(xiàn)的代碼段。

        在”字符串”列表中選擇一個(gè)源文后,在下方會(huì)出現(xiàn)譯 文編輯框,在此填寫(xiě)字符串對(duì)應(yīng)的英文譯文。 Linguist 可以 同時(shí)打開(kāi)項(xiàng)目的多個(gè) ts 文件,在選中一個(gè)源文后,在下方會(huì) 出現(xiàn)對(duì)應(yīng)的多個(gè)語(yǔ) 言的譯文編輯框 ,可以同時(shí)翻譯為多個(gè)語(yǔ)言版本。

 4.調(diào)用翻譯文件改變界面語(yǔ)言

4.1. 生成 qm 文件

        使用 Linguist 軟件編輯翻譯文件,將所有字符串都翻譯后,在 Qt Creator 中單擊主菜單項(xiàng) "Tools" -- "External" -- "Qt 語(yǔ)言家”-- "Release Translations(lrelease) ",會(huì)在項(xiàng)目源程序目錄 下生成與 ts 文件對(duì)應(yīng)的 qm 文件,這是更為緊湊的翻譯文件。 會(huì)生成  lang_Chs.qm和  lang_Eng.qm。

 2. 項(xiàng)目啟動(dòng)時(shí)設(shè)置界面語(yǔ)言

        使用 QTranslator 類(lèi)設(shè)置界面的不同語(yǔ)言版本,需在應(yīng)用程序啟動(dòng)時(shí)設(shè)置界面語(yǔ)言翻譯文件, 即在 main()函數(shù)中進(jìn)行處理 。項(xiàng)目 在main.cpp 的代碼如下: 

#include "mainwindow.h"
#include <QApplication> 
#include <QTranslator> 
#include <QSettings> 
 
QTranslator *trans=NULL ; 
QString readSetting(); 
 
int main (int argc , char *argv[]) 
{ 
    QApplication app(argc, argv); 
    trans = new QTranslator; 
 
    QString curLang=readSetting (); //讀取語(yǔ)言設(shè)置
 
    if (curLang== "EN")
     {
        trans->load ("lang_Eng.qm"); 
     }
    else 
    {
        trans->load("lang_Chs.qm"); 
    }
 
    app.installTranslator(trans); 
 
    MainWindow w; 
    w.show(); 
    return app.exec(); 
}
 
QString readSetting() 
{
    //注冊(cè)表讀取上 次設(shè)置的語(yǔ)言
    QString organization = "Language"; 
    QString appName= "test"; 
    QSettings settings(organization, appName) ; 
    QStri n g Language=settings.value ("Language"," EN").toString(); 
    return Language ; 
}

        這里定義了 個(gè)全局變 trans, main.cpp 里定義了個(gè)函數(shù) readSetting(), 用千從注冊(cè)表里讀取上次設(shè)置的界面語(yǔ)言版本。注冊(cè)表里數(shù)據(jù)的讀取和寫(xiě)入使用到 QSettings 類(lèi),在main()函數(shù)中,創(chuàng)建 QTranslator 類(lèi)的對(duì)象 trans 后,調(diào)用 readSetting()函數(shù)從注冊(cè)表里讀取 上次的語(yǔ)言版本,若為 “EN" ,就用 load()函數(shù)載入編譯后的英文翻譯文件 lang_Eng.qm, 否則就載入中文翻譯文件lang_Chs.qm ,再執(zhí)行 app.installTranslator(trans) ,就可以給應(yīng)用程序安裝翻譯器,實(shí)現(xiàn)需要的界面版本。

 3. 動(dòng)態(tài)切換語(yǔ)言

        在軟件運(yùn)行時(shí)可以動(dòng)態(tài)切換語(yǔ) ,即 啟軟件就可以切換界面語(yǔ)言,測(cè)試程序的主窗 口上有“中文”和 “English" 兩個(gè)工具欄按鈕,用千實(shí)現(xiàn)中文和英文界面的切換。 下面是這兩個(gè) 按鈕的響應(yīng)代碼: 

void MainWindow::on_actLang_CN_triggered() 
{//中文界面
 
    qApp->removeTranslator(trans); 
    
    if (trans)
    {
        delete trans;
        trans = NULL;
    } 
 
    trans = new Qtranslator; 
    trans->load("lang_Chs.qm"); 
    qApp->installTranslator(trans); 
 
    //這一步很關(guān)鍵
    ui->retranslateUi(this);  //刷新界面字符串
 
    QSettings settings("WWB-Qt", "test"); 
    settings.setValue ("Language ", "CN") ; 
}
 
void Maindow::on_actLang_EN_triggered()
{//英文界面
    qApp->removeTranslator(trans) ; 
    if (trans)
    {
        delete trans;
        trans = NULL;
    } 
 
    trans=new Qtranslator; 
    trans->load( " sampl6_l_en.qm"); 
    qApp->installTranslator(trans) ; 
    
    //這一步很關(guān)鍵
    ui->retranslateUi(this) ; //刷新界面字符串
    QSettings settings( "WWB-Qt","test"); 
    settings.setValue ("Language", "EN");
}

        一個(gè)應(yīng)用程序只能加載一個(gè)翻譯器 ,因?yàn)樵?main()函數(shù)里已 經(jīng)加載了一個(gè)翻譯器 ,所以需 要先移除當(dāng)前的翻譯器,才能重新創(chuàng)建新的翻譯器,加載翻譯文件,并為應(yīng)用程序重新加載新翻譯器。

        完成這些后還必須調(diào)用 UI的retranslateUi() 函數(shù)來(lái)刷新界面。

        retranslateUi()函數(shù)是在窗口的 ui _" 頭文件中自動(dòng)生成的 ,如 mainwindow. ui 主窗口對(duì)應(yīng)的 頭文件 ui _mainwindow.h 里就有函數(shù) retranslateUi(),這個(gè)函數(shù)使用 QApplication::translate() 函數(shù)將 所有界面字符串進(jìn)行翻譯 ,類(lèi)似于 tr()函數(shù)的功能。

        窗口在被創(chuàng)建時(shí)會(huì)自動(dòng)調(diào)用此 retranslateUi() 函數(shù),在程序運(yùn)行中動(dòng)態(tài)切換界面語(yǔ)言時(shí),必須 手工調(diào)用此 retranslateUi() 函數(shù),才可以立即更新界面語(yǔ)言。

        若不是用 Designer 設(shè)計(jì)的窗口,而是完全由代碼實(shí)現(xiàn)的窗口界面,需要專(zhuān)門(mén)設(shè)計(jì)一個(gè) retranslateUi() 函數(shù),將所有界面字符串用 tr() 函數(shù)進(jìn)行翻譯,并在動(dòng)態(tài)切換語(yǔ)言時(shí)調(diào)用此函數(shù)。  很顯然 這樣做比較麻煩,特別是當(dāng)軟件比較大窗口非常多時(shí)。所以,大型的軟件在重新設(shè)置語(yǔ)言版本后 一般要求重新啟動(dòng)軟件才生效 ,在程序啟動(dòng)時(shí)根據(jù)上次的設(shè)置加載一次翻譯器即可。

        按鈕響應(yīng)代碼的最后是將設(shè)置的語(yǔ)言版本寫(xiě)入本地配置文件 ,以便下次程序啟動(dòng)時(shí)自動(dòng)加載相應(yīng)的語(yǔ)言。

到此這篇關(guān)于Qt 多語(yǔ)言程序設(shè)計(jì)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt 多語(yǔ)言程序設(shè)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解析C語(yǔ)言中如何正確使用const

    解析C語(yǔ)言中如何正確使用const

    本篇文章是對(duì)C語(yǔ)言中如何正確使用const,進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • Visual Studio添加第三方庫(kù)的實(shí)現(xiàn)步驟

    Visual Studio添加第三方庫(kù)的實(shí)現(xiàn)步驟

    使用Visual Studio編寫(xiě)C語(yǔ)言程序能夠提供全面而強(qiáng)大的開(kāi)發(fā)環(huán)境,本文主要介紹了Visual Studio添加第三方庫(kù)的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • VisualStudio2022提交git代碼的方法實(shí)現(xiàn)

    VisualStudio2022提交git代碼的方法實(shí)現(xiàn)

    本文主要介紹了VisualStudio2022提交git代碼的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解C#byte數(shù)組怎么傳入C

    詳解C#byte數(shù)組怎么傳入C

    在本篇內(nèi)容里小編給大家整理了關(guān)于C#byte數(shù)組怎么傳入C的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)參考下。
    2019-03-03
  • 安裝OpenMPI來(lái)配合C語(yǔ)言程序進(jìn)行并行計(jì)算

    安裝OpenMPI來(lái)配合C語(yǔ)言程序進(jìn)行并行計(jì)算

    這篇文章主要介紹了安裝OpenMPI來(lái)配合C語(yǔ)言程序進(jìn)行并行計(jì)算的例子,MPI的全稱(chēng)是Message Passing Interface即標(biāo)準(zhǔn)消息傳遞界面,可以用于并行計(jì)算,需要的朋友可以參考下
    2015-11-11
  • MFC預(yù)編譯頭文件stdafx.h及stdafx.cpp的使用小結(jié)

    MFC預(yù)編譯頭文件stdafx.h及stdafx.cpp的使用小結(jié)

    MFC項(xiàng)目中的stdafx.h和stdafx.cpp文件用于提高編譯效率,通過(guò)預(yù)編譯頭文件加快編譯速度,本文就來(lái)詳細(xì)的介紹一下stdafx.h及stdafx.cpp的使用小結(jié),感興趣的可以了解一下
    2026-05-05
  • 使用c語(yǔ)言輸出楊輝三角形的簡(jiǎn)單方法

    使用c語(yǔ)言輸出楊輝三角形的簡(jiǎn)單方法

    這篇文章主要給大家介紹了關(guān)于如何使用c語(yǔ)言輸出楊輝三角形的簡(jiǎn)單方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++中的類(lèi)型查詢(xún)之探索typeid和type_info(推薦)

    C++中的類(lèi)型查詢(xún)之探索typeid和type_info(推薦)

    C++ 是一種靜態(tài)類(lèi)型語(yǔ)言,這意味著每個(gè)變量的類(lèi)型在編譯時(shí)就已經(jīng)確定,在這篇技術(shù)分享中,我們將探討 C++ 中的 typeid 和 type_info,以及如何使用它們來(lái)獲取類(lèi)型信息,需要的朋友可以參考下
    2024-05-05
  • C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)

    C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)

    C++支持運(yùn)算符重載,對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō),這個(gè)可能比較陌生一些,因?yàn)镴ava不支持運(yùn)算符重載,下面介紹一下HotSpot?VM中的運(yùn)算符重載,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • C++面試八股文之了解auto關(guān)鍵字

    C++面試八股文之了解auto關(guān)鍵字

    這篇文章主要為大家介紹了C++面試八股文之了解auto關(guān)鍵字問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論

郸城县| 连州市| 青州市| 五河县| 马尔康县| 册亨县| 昌平区| 杭锦后旗| 蓝山县| 鹤庆县| 安西县| 锦屏县| 永清县| 曲靖市| 石阡县| 延寿县| 沙雅县| 苍山县| 远安县| 湘乡市| 莎车县| 天祝| 喜德县| 西丰县| 伊通| 郸城县| 郴州市| 沿河| 高碑店市| 南宁市| 广安市| 民乐县| 临潭县| 常宁市| 盐城市| 正阳县| 宁晋县| 诸暨市| 营口市| 乌拉特前旗| 永丰县|