欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

QT中文亂碼與國(guó)際化支持

系統(tǒng) 2337 0

QT國(guó)際化支持

Qt內(nèi)部采用的全Unicode編碼,這從根本上保證了多國(guó)語(yǔ)界面實(shí)現(xiàn)的正確性和便捷性。Qt本身提供的linguist工具,用來(lái)實(shí)現(xiàn)翻譯過(guò)程十分方便。MFC中利用資源DLL切換資源,或使用多個(gè)RC文件進(jìn)行不同語(yǔ)言版本編譯等方法都十分麻煩,如果你曾經(jīng)使用過(guò)MFC,QT解決多語(yǔ)言問(wèn)題的便捷性絕對(duì)會(huì)讓你感覺(jué)是一種享受。本文討論以下幾個(gè)方面內(nèi)容:

1、QT中解決中文亂碼的方法;

2、QT中實(shí)現(xiàn)國(guó)家化支持。

3、對(duì)話框?qū)崿F(xiàn)多語(yǔ)言

一、中文亂碼

1、在程序中直接使用中文,需要在程序中加入以下代碼:

  1. #include<QTextCodec>
  2. int main( int argc, char **argv)
  3. {
  4. QApplicationapp(argc,argv);
  5. QTextCodec*codec=QTextCodec::codecForName( "GB2312" );
  6. QTextCodec::setCodecForLocale(codec);
  7. QTextCodec::setCodecForCStrings(codec);
  8. QTextCodec::setCodecForTr(codec);
  9. …………
  10. return app.exec();
  11. }

這樣在程序中使用tr(“中文”)或者直接使用“中文”了;

2、解決讀取ini文件中中文亂碼

QSettings settings("xxxx.ini",QSettings::IniFormat);

settings.setIniCodec(QTextCodec::codecForName("GB2312")); settings.beginGroup("company");

3、解決讀取中文文件中文的亂碼

  1. QFilefile( "xxxx.txt" );
  2. QTextStreamstream(file,QIODevice::ReadOnly);
  3. stream.setCodeC(QTextCodec::codecForName( "GB2312" ));
  4. stream.readAll();

二、國(guó)際化支持

QT中實(shí)現(xiàn)多國(guó)語(yǔ)言,建議在程序中直接英文,而后通過(guò)不同的翻譯文件實(shí)現(xiàn)多語(yǔ)言的支持。實(shí)現(xiàn)多國(guó)語(yǔ)的步驟有如下幾步(提及的工具均為QT自帶):

?在需要被翻譯的字符串前面加標(biāo)識(shí)tr,如QString str=tr(“hello,world!”);這很重要,因?yàn)榉g工具會(huì)把源碼中tr標(biāo)識(shí)的字符串提取出來(lái),翻譯成其他語(yǔ)言,如果沒(méi)有用tr標(biāo)識(shí)的,不會(huì)被工具提取。在界面中輸入的文字,默認(rèn)已經(jīng)是加上tr的了,所以在翻譯時(shí)也能看見(jiàn)。

?在QT工程文件*.pro中增加一項(xiàng):TRANSLATIONS+=*.ts,擴(kuò)展名為.ts是翻譯的源文件。一般會(huì)在命名中把區(qū)域加進(jìn)去,更好的注釋這些文件是用于什么語(yǔ)言的,可以根據(jù)“語(yǔ)言_國(guó)家”的形式形成文件名。比如中命名為myapp_zh_CN.ts,zh表示簡(jiǎn)體中文,而CN表示的就是中華人名共和國(guó)??梢詤⒄誌SO語(yǔ)言與國(guó)家代碼標(biāo)準(zhǔn): http://blog.csdn.net/alicehyxx/archive/2009/12/06/4952318.aspx

?使用lupdate工具提取翻譯源文件,【運(yùn)行】中輸入CMD,打開(kāi)命令行窗口,利用CD命令切換到QT安裝目錄的BIN目錄中,而后輸入:

lupdate *.pro

*.pro包含pro文件的全路徑。lupdate會(huì)解析*.pro文件,生成TRANSLATIONS中的*.ts文件,這些文件可以被linguist工具打開(kāi),按照提示一個(gè)一個(gè)的翻譯成需要的文件并保存。

?重復(fù)以上兩步!
(針對(duì)以上兩步,VS2005中可以直接使用菜單【QT】à【Create new translations File】創(chuàng)建,如果文件已經(jīng)存在,可以通過(guò)圖1.1菜單進(jìn)行更新。)

QT中文亂碼與國(guó)際化支持

圖1.1 VS2005_lupdate

?使用lrelease工具發(fā)布翻譯文件的二進(jìn)制文件,這樣在程序運(yùn)行時(shí)載入會(huì)大大的加快速度。在命令行窗口中繼續(xù)輸入:

lrelease *.ts

*.ts包含ts文件的全路徑。這個(gè)工具會(huì)提示你多少語(yǔ)句被翻譯,多少被忽略了等。生成的文件是*.qm,與同名的*.ts只是換了一個(gè)擴(kuò)展名。這個(gè)就是我們程序需要使用到的文件。

(VS2005中可以使用圖1.1中的菜單lrelease來(lái)實(shí)現(xiàn)該步驟)

?使用*.qm文件。程序可以通過(guò)兩種方式加載翻譯文件,一種硬編碼方式,直接指定加載的語(yǔ)言,代碼如下:

int main(int argc,char* argv[])

{

QApplication app(arcg,argv);

QTranslator translator;

translator.load(“basicdraw_zh_CN”);

app.installTranslator(&translator);

}

另外一種是自動(dòng)判斷翻譯當(dāng)前的locale,再裝入相應(yīng)的翻譯文件,如下所示:

int main(int argc,char* argv[])

{

QApplication app(arcg,argv);

QString locale = QLocale::system().name();

QTranslator translator;

translator.load(QString(“basicdraw_”) + locale);

app.installTranslator(&translator);

}

其中QLocale::system().name()返回以“語(yǔ)言_國(guó)家”形式形成的字符串,比如zh_CN。

至于通過(guò)控件,比如ComboBox選擇語(yǔ)言,并實(shí)現(xiàn)動(dòng)態(tài)切換,以后再討論。

三、對(duì)話框?qū)崿F(xiàn)多語(yǔ)言

在實(shí)際程序中實(shí)現(xiàn)多語(yǔ)言切換,需要生成的qm文件應(yīng)該包含兩個(gè):

?QT運(yùn)行庫(kù)相關(guān)的qm文件:在QT安裝目錄的translations目錄下,存在需要*.ts文件,利用lrelease命令生成對(duì)應(yīng)的qm文件。

?利用“二”中的步驟生成程序本身需要的*.ts文件,并生成qm文件。

QApplication支持多個(gè)翻譯文件,并根據(jù)后加入先使用的搜索順序進(jìn)行搜索。

具體代碼如下:
main.cpp

  1. #include"stdafx.h"
  2. #include<QtGui/QApplication>
  3. #include<QtGui/QtGui>
  4. #include"DialogLogin.h"
  5. int main( int argc, char *argv[])
  6. {
  7. QApplicationapp(argc,argv);
  8. QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
  9. //安裝QT運(yùn)行庫(kù)翻譯器
  10. QTranslatortranslatorQT;
  11. {
  12. QStringListenvironment=QProcess::systemEnvironment();
  13. QStringstr;
  14. bool bFinded= false ;
  15. foreach(str,environment)
  16. {
  17. if (str.startsWith( "QTDIR=" ))
  18. {
  19. bFinded= true ;
  20. break ;
  21. }
  22. }
  23. if (bFinded)
  24. {
  25. str=str.mid(6);
  26. bFinded=translatorQT.load( "qt_" +QLocale::system().name(),str.append( "/translations/" ));
  27. if (bFinded)
  28. app.installTranslator(&translatorQT);
  29. else
  30. qDebug()<<QObject::tr( "Can'tfindthetranslationfileforChinese!" );
  31. }
  32. else
  33. {
  34. qDebug()<<QObject::tr( "PleasesettheenvironmentvariableQTDIR" );
  35. }
  36. }
  37. //安裝程序自身翻譯器
  38. QTranslatortranslatorApp;
  39. {
  40. QStringstrLanguageDir=QCoreApplication::applicationDirPath();
  41. strLanguageDir.append( "/Language/" );
  42. QStringstrFilePath=QApplication::applicationFilePath();
  43. QStringstrFileName=strFilePath.right(strFilePath.size()-strFilePath.lastIndexOf( '/' )-1);
  44. strFileName=strFileName.left(strFileName.indexOf( '.' ));
  45. strFileName.append( '_' );
  46. strFileName.append(QLocale::system().name());
  47. bool bFinded=translatorApp.load(strFileName,strLanguageDir);
  48. if (bFinded)
  49. app.installTranslator(&translatorApp);
  50. else
  51. {
  52. qDebug()<<QObject::tr( "Can'tFindTheTranslation'sFileForChinese!" );
  53. }
  54. }
  55. CDialogLogindlg;
  56. return dlg.exec();
  57. }

DialogLogin.h

  1. #pragmaonce
  2. #include<QtGui/QDialog>
  3. class QLineEdit;
  4. class CDialogLogin: public QDialog
  5. {
  6. Q_OBJECT
  7. public :
  8. CDialogLogin(QWidget*parent=0);
  9. ~CDialogLogin( void );
  10. public slots:
  11. virtual void accept();
  12. private :
  13. QLineEdit*m_pUsrLineEdit;
  14. QLineEdit*m_pPwdLineEdit;
  15. };

程序中使用了兩個(gè) QTranslator 對(duì)象,在app 利用函數(shù) installTranslator() 進(jìn)行翻譯器安裝時(shí),并沒(méi)有拷貝qm 文件,而是在需要的時(shí)候在qm文件中進(jìn)行查找。也即是說(shuō):QTranslator在load以后,并沒(méi)有把qm文件中的數(shù)據(jù)拷貝一份。如果qm在這期間被刪除或修改,對(duì)程序都是有影響的。擴(kuò)展開(kāi)來(lái),QTranslator必須保證要一直有效,如果在函數(shù)中定義的局部變量,函數(shù)結(jié)束后就自動(dòng)釋放掉了,那么翻譯工作就不能正常進(jìn)行。
DialogLogin.cpp

  1. #include"stdafx.h"
  2. #include"DialogLogin.h"
  3. #include<QtGui/QtGui>
  4. CDialogLogin::CDialogLogin(QWidget*parent /*=0*/ )
  5. :QDialog(parent)
  6. {
  7. QLabel*pUsrLabel= new QLabel(tr( "UserName:" ));
  8. QLabel*pPwdLabel= new QLabel(tr( "Password:" ));
  9. m_pUsrLineEdit= new QLineEdit();
  10. m_pPwdLineEdit= new QLineEdit();
  11. m_pPwdLineEdit->setEchoMode(QLineEdit::Password);
  12. QGridLayout*pGridLayout= new QGridLayout();
  13. pGridLayout->addWidget(pUsrLabel,0,0,1,1);
  14. pGridLayout->addWidget(m_pUsrLineEdit,0,1,1,3);
  15. pGridLayout->addWidget(pPwdLabel,1,0,1,1);
  16. pGridLayout->addWidget(m_pPwdLineEdit,1,1,1,3);
  17. pGridLayout->setSpacing(25);
  18. QPushButton*pBtnOK= new QPushButton(tr( "Login" ));
  19. QPushButton*pBtnCancel= new QPushButton(tr( "Cancel" ));
  20. QHBoxLayout*pBtnLayout= new QHBoxLayout();
  21. pBtnLayout->setSpacing(60);
  22. pBtnLayout->addWidget(pBtnOK);
  23. pBtnLayout->addWidget(pBtnCancel);
  24. QVBoxLayout*pDlgLayout= new QVBoxLayout();
  25. pDlgLayout->setMargin(30);
  26. pDlgLayout->addLayout(pGridLayout);
  27. pDlgLayout->addStretch(40);
  28. pDlgLayout->addLayout(pBtnLayout);
  29. pDlgLayout->setSpacing(40);
  30. setLayout(pDlgLayout);
  31. connect(pBtnOK,SIGNAL(clicked()), this ,SLOT(accept()));
  32. connect(pBtnCancel,SIGNAL(clicked()), this ,SLOT(reject()));
  33. setWindowTitle(tr( "Login" ));
  34. resize(300,200);
  35. }
  36. CDialogLogin::~CDialogLogin( void )
  37. {
  38. }
  39. void CDialogLogin::accept()
  40. {
  41. if (m_pUsrLineEdit->text().trimmed()==tr( "lcf" )&&m_pPwdLineEdit->text().trimmed()==tr( "lcf" ))
  42. {
  43. QDialog::accept();
  44. }
  45. else
  46. {
  47. QMessageBox::warning( this ,tr( "Warning" ),tr( "UserNameorPasswordiswrong!" ),QMessageBox::Yes);
  48. m_pUsrLineEdit->setFocus();
  49. }
  50. }


其中英文界面如圖:

圖1.2英文界面

QT中文亂碼與國(guó)際化支持
中文界面如圖:

圖1.3中文界面

QT中文亂碼與國(guó)際化支持

轉(zhuǎn)自: http://blog.csdn.net/alicehyxx/article/details/4960571

QT中文亂碼與國(guó)際化支持


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 美女久久| 欧美精品99| 欧美成人激情视频 | 国产成人精品在线 | 偶像练习生在线免费观看 | 午夜在线免费视频 | 欧美亚洲视频在线观看 | 日韩一区二区免费看 | 天天操网 | 亚州精品天堂中文字幕 | 四虎影视在线影院在线观看观看 | 欧美激情一区二区三级高清视频 | 老司机精品视频个人在观看 | 亚洲精品国产自在久久出水 | 欧美成人观看 | 四虎1515hh海外永久免费在线 | 成年在线视频免费视频观看 | 日韩中文在线 | 日本视频不卡 | 色先锋av资源中文字幕 | 国产亚洲精品久久久久久线投注 | 中文字幕亚洲精品 | 一区二区三区国产免费 | 久久天天躁狠狠躁夜夜躁2014 | 精品久久久久区二区8888 | 性夜影院爽黄a爽在线看香蕉 | 福利一区在线视频 | 婷婷色激情 | 中国精品久久 | 亚洲视频在线看 | 精品三级国产精品经典三 | 清纯唯美综合网 | 免费色在线 | 香港一级毛片免费看 | 五月色综合 | 久久伊人草 | 亚洲国产黄色 | 免费一级毛片 | 波多野结衣亚洲一区二区三区 | theporn国产在线精品 | 欧美第一页草草影院浮力 |