久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Qt學(xué)習(xí)之路(33): 國際化(上)

 風(fēng)之library 2015-01-30
2D繪圖部分基本告一段落,,還在想下面的部分要寫什么,,本來計(jì)劃先說下view-model的相關(guān)問題,但是前面看到有朋友問關(guān)于國際化的問題,,所以現(xiàn)在先來說說Qt的國際化吧,!
Qt中的國際化的方法有很多,,常用的有使用QTextCodec類和使用tr()函數(shù)。前者將編碼名稱寫到代碼里面,,除非你使用Unicode編碼,,否則國際化依然是一個(gè)問題;后者就不會有這個(gè)問題,,并且這也是Qt推薦的做法,。因此,我們主要來說使用tr()函數(shù)的方法進(jìn)行應(yīng)用程序的國際化,。
我們先來看一個(gè)很簡單的MainWindow,。為了清楚起見,這里只給出了cpp文件的內(nèi)容:
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
{
        QMenuBar *menuBar = new QMenuBar(this);
        QMenu *fileMenu = new QMenu(tr("&File"), menuBar);
        QAction *newFile = new QAction(tr("&New..."), fileMenu);
        fileMenu->addAction(newFile);
        QAction *openFile = new QAction(tr("&Open..."), fileMenu);
        fileMenu->addAction(openFile);
        menuBar->addMenu(fileMenu);
        setMenuBar(menuBar);

        connect(openFile, SIGNAL(triggered()), this, SLOT(fileOpen()));
}

MainWindow::~MainWindow()
{

}

void MainWindow::fileOpen()
{
        QFileDialog *fileDialog = new QFileDialog(this);
        fileDialog->setWindowTitle(tr("Open File"));
        fileDialog->setDirectory(".");
        if(fileDialog->exec() == QDialog::Accepted) {
                QString path = fileDialog->selectedFiles()[0];
                QMessageBox::information(NULL, tr("Path"), tr("You selected\n%1").arg(path));
        } else {
                QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));
        }
}
這是一個(gè)很簡單的類,,運(yùn)行結(jié)果想必大家也都非常清楚:就是一個(gè)主窗口,,上面有一個(gè)菜單欄,一個(gè)File菜單,,里面有兩個(gè)菜單項(xiàng):
之所以把運(yùn)行圖貼出來,,是為了大家能夠看清,在代碼中的&符號實(shí)際在界面中顯示成為一條下劃線,,標(biāo)記出這個(gè)菜單或者菜單項(xiàng)的快捷鍵,。按照代碼,當(dāng)我們點(diǎn)擊了Open時(shí),,會彈出一個(gè)打開文件的對話框:
這里的slot里面的代碼在前文中已經(jīng)詳細(xì)介紹過,。也許你會問,為什么要用這種麻煩的寫法呢,?因?yàn)槲覀冊?jīng)說過,,使用static函數(shù)實(shí)際上是直接調(diào)用系統(tǒng)的對話框,而這種構(gòu)造函數(shù)法是Qt自己繪制的,。這對我們后面的國際化是有一定的影響的,。
好了,都已經(jīng)準(zhǔn)備好了,,下面開始進(jìn)行國際化,。所謂國際化,實(shí)際上不僅僅是把界面中的各種文字翻譯成另外的語言,,還有一些工作是要進(jìn)行書寫方式,、貨幣等的轉(zhuǎn)換。比如,,阿拉伯書寫時(shí)從右向左的,,這些在國際化工作中必須完成。但是在這里,我們只進(jìn)行最簡單的工作,,就是把界面的文字翻譯成中文,。
首先,我們需要在pro文件中增加一行:
TRANSLATIONS += myapp.ts
myapp.ts是我們需要?jiǎng)?chuàng)建的翻譯文件,。這個(gè)文件的名字是任意的,,不過后綴名需要是ts。然后我們打開命令提示符,,進(jìn)入到工程所在目錄,,比如我的是E:\My Documents\Workspace\Qt\MyApp,也就是pro文件所在的文件夾,,然后輸入命令
lupdate MyApp.pro
,,如果你出現(xiàn)的是命令不存在,請注意將Qt的bin目錄添加到環(huán)境變量中,。此時(shí),,如果更新的數(shù)目,說明ts文件創(chuàng)建成功:
最后一行是說,,找到7個(gè)需要翻譯的原文字,,0個(gè)已經(jīng)存在。也就是說,,這個(gè)文件是新建的,。這時(shí)你會在工程目錄下找到這個(gè)myapp.ts文件。也許你會奇怪,,為什么這里還會說已存在的數(shù)目呢,?因?yàn)镼t這個(gè)工具很智能的能夠識別出已經(jīng)存在的文字和修改或新增的文字,這樣在以后的工作中就不需要一遍遍重復(fù)翻譯以前的文字了,。這也就是為什么這個(gè)工具的名字是“l(fā)update”的原因,,因?yàn)樗恰皍pdate”,而不僅僅是生成,。
如果你有興趣的話,,可以用記事本打開這個(gè)ts文件,,這個(gè)文件實(shí)際上是一個(gè)XML文件,,結(jié)構(gòu)很清晰。不過,,我們要使用專業(yè)的翻譯工具進(jìn)行翻譯,。Qt提供了一個(gè)工具,Qt Linguist,,你可以在開始菜單的Qt項(xiàng)下面的Tools中找到,。用它可以打開我們的ts文件,然后進(jìn)行我們的翻譯工作:
完全翻譯完成后保存文件,然后在文件菜單下有個(gè)“發(fā)布”,。點(diǎn)擊這個(gè)按鈕,,工程目錄下會有一個(gè)myapp.qm文件,這就是我們翻譯得到的文件,。Qt的qm文件實(shí)際上是二進(jìn)制格式的,,因此它經(jīng)過了高度的優(yōu)化,體積很小,。
下面我們要修改main()函數(shù),,使之加載這個(gè)qm文件:
int main(int argc, char *argv[])
{
        QApplication a(argc, argv);
        QTranslator qtTranslator;
        qtTranslator.load("myapp.qm");
        a.installTranslator(&qtTranslator);
        MainWindow w;
        w.resize(800, 600);
        w.show();
        return a.exec();
}
注意,QTranslator類實(shí)際是在QtCore下面的,。代碼還是很清晰:創(chuàng)建一個(gè)QTranslator對象,,然后加載qm文件,然后將這個(gè)對象安裝到QApplication類,。好了,,現(xiàn)在大功告成,重新編譯后運(yùn)行下程序吧,!
咦,?怎么還是英文的?哪里有錯(cuò)誤了呢,?這里往往令人疑惑,,其實(shí),這是由于我們使用load()函數(shù)加載qm文件時(shí)使用的是相對路徑,,這樣直接load(“myapp.qm”),,其實(shí)會在當(dāng)前編譯后的exe所在目錄下尋找這個(gè)qm文件,所以,,只要我們把qm文件同exe放在同一目錄下,,再次運(yùn)行:
現(xiàn)在,這個(gè)界面已經(jīng)是中文了吧,!其實(shí),,這一小細(xì)節(jié)已經(jīng)說明,qm文件其實(shí)是動態(tài)加載到exe文件中的,,而不是直接編譯進(jìn)去的,。這一點(diǎn)為我們進(jìn)行動態(tài)切換語言提供了基礎(chǔ)。

本文出自 “豆子空間” 博客,,請務(wù)必保留此出處http://devbean.blog.51cto.com/448512/244689

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多