亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

QT中文亂碼與國際化支持

系統 2278 0

QT國際化支持

Qt內部采用的全Unicode編碼,這從根本上保證了多國語界面實現的正確性和便捷性。Qt本身提供的linguist工具,用來實現翻譯過程十分方便。MFC中利用資源DLL切換資源,或使用多個RC文件進行不同語言版本編譯等方法都十分麻煩,如果你曾經使用過MFC,QT解決多語言問題的便捷性絕對會讓你感覺是一種享受。本文討論以下幾個方面內容:

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

2、QT中實現國家化支持。

3、對話框實現多語言

一、中文亂碼

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();

二、國際化支持

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

?在需要被翻譯的字符串前面加標識tr,如QString str=tr(“hello,world!”);這很重要,因為翻譯工具會把源碼中tr標識的字符串提取出來,翻譯成其他語言,如果沒有用tr標識的,不會被工具提取。在界面中輸入的文字,默認已經是加上tr的了,所以在翻譯時也能看見。

?在QT工程文件*.pro中增加一項:TRANSLATIONS+=*.ts,擴展名為.ts是翻譯的源文件。一般會在命名中把區域加進去,更好的注釋這些文件是用于什么語言的,可以根據“語言_國家”的形式形成文件名。比如中命名為myapp_zh_CN.ts,zh表示簡體中文,而CN表示的就是中華人名共和國。可以參照ISO語言與國家代碼標準: http://blog.csdn.net/alicehyxx/archive/2009/12/06/4952318.aspx

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

lupdate *.pro

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

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

QT中文亂碼與國際化支持

圖1.1 VS2005_lupdate

?使用lrelease工具發布翻譯文件的二進制文件,這樣在程序運行時載入會大大的加快速度。在命令行窗口中繼續輸入:

lrelease *.ts

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

(VS2005中可以使用圖1.1中的菜單lrelease來實現該步驟)

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

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

{

QApplication app(arcg,argv);

QTranslator translator;

translator.load(“basicdraw_zh_CN”);

app.installTranslator(&translator);

}

另外一種是自動判斷翻譯當前的locale,再裝入相應的翻譯文件,如下所示:

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()返回以“語言_國家”形式形成的字符串,比如zh_CN。

至于通過控件,比如ComboBox選擇語言,并實現動態切換,以后再討論。

三、對話框實現多語言

在實際程序中實現多語言切換,需要生成的qm文件應該包含兩個:

?QT運行庫相關的qm文件:在QT安裝目錄的translations目錄下,存在需要*.ts文件,利用lrelease命令生成對應的qm文件。

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

QApplication支持多個翻譯文件,并根據后加入先使用的搜索順序進行搜索。

具體代碼如下:
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運行庫翻譯器
  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. };

程序中使用了兩個 QTranslator 對象,在app 利用函數 installTranslator() 進行翻譯器安裝時,并沒有拷貝qm 文件,而是在需要的時候在qm文件中進行查找。也即是說:QTranslator在load以后,并沒有把qm文件中的數據拷貝一份。如果qm在這期間被刪除或修改,對程序都是有影響的。擴展開來,QTranslator必須保證要一直有效,如果在函數中定義的局部變量,函數結束后就自動釋放掉了,那么翻譯工作就不能正常進行。
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中文亂碼與國際化支持
中文界面如圖:

圖1.3中文界面

QT中文亂碼與國際化支持

轉自: http://blog.csdn.net/alicehyxx/article/details/4960571

QT中文亂碼與國際化支持


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品福利在线 | 亚洲成人综合视频 | 亚洲国产综合专区在线播一一 | 在线观看久久 | 青春禁区视频在线观看动漫版 | 国产1区2区3区在线观看 | 天色噜噜噜噜 | 美女被爆羞羞视频网站视频 | 久久成人免费播放网站 | 国产精品久久久久久久久免费 | 国产激情视频趣趣在线观看的 | 久久国产亚洲精品麻豆 | 国产目拍亚洲精品一区麻豆 | 理论片我不卡在线观看 | 一级黄色毛片播放 | 国农村精品国产自线拍 | 在线视频日韩精品 | 久久夜色精品国产尤物 | 尤物视频在线观看视频 | 中文字幕在线免费观看 | 中文字幕在线观看免费视频 | 亚洲视频一二区 | 欧美久久亚洲精品 | 九九在线免费观看视频 | 久久精品国产99国产精品 | 亚洲精品福利一区二区三区 | 精品久久久在线观看 | 免费女人18毛片a级毛片视频 | 97在线视频精品 | 国产亚洲精品久久综合影院 | 四虎永久免费观看 | 国产99视频在线 | 色玖玖| a毛片在线 | 深夜免费看 | 久久久精品2021免费观看 | 精品无人乱码一区二区三区 | 日本一区精品久久久久影院 | 亚洲福利一区福利三区 | 精品中文字幕乱码一区二区 | 一级毛片免费视频网站 |