Qt 界面实现多国语言的切换实例

来源:互联网 发布:kindle 知乎 编辑:程序博客网 时间:2024/04/28 20:27

Qt 界面实现多国语言切换实例是本文要介绍的内容,一直认为Qt界面相对于还是很好实现的一种开发。多国语界面的实现,在MFC中是很别扭的。以前在作MFC时,实现多国语言界面,只有把资源文件做成各个语言的资源DLL,在程序启动时,根据选择判断选择载入哪个DLL来获取资源。MFC的资源也是分语言的,在创建资源的时候要选择,但是这样的实现还有有弊端。最根本的原因是MFC的资源文件不是Unicode编码的,而是不同语言的本地码,至少VC6是这样的。这样在中文系统中载入日文的资源,界面出现的是乱码。

Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性。Qt本身提供的linguist工具,就是来实现这个翻译过程的。实现多国语的步骤大体上说来有这么几步:

1、在需要被翻译的字符串前面标识tr,如QString str=tr(“hello,world!”); ,这很重要,因为翻译工具会把源码中tr标识的字符串提取出来,翻译成其他语言,如果没有用tr标识的,不会被工具提取。在界面中输入的文字,默认已经是加上tr的了,所以在翻译时也能看见。建议:在程序中的字符串使用英文,汉语等通过多国语翻译来实现,而不要采取把汉字写在代码中。

2、在工程文件***.pro中,添加一项 TRANSLATIONS +=    ***.ts  ****.ts 扩展名为.ts是翻译的源文件,表示生成这几个文件。一般我们会在命名中把区域加进去,更好的注释这些文件是用于什么语言的,比如中文大多会这样命名 myapp_zh_CN.ts, zh_CN表示的就是中国。

3、使用lupdate工具提取翻译源文件, 命令是这样的  #lupdate ***.pro ,lupdate会解析***.pro即工程文件,生成TRANSLATIONS中的 ***.ts 几个文件,这些文件可以被linguist工具打开,按照提示一个一个的翻译成需要的文件,然后保存就OK,

linguist的使用很简单,一看界面基本就会了。上面提到的这些工具都是Qt自带的。

4、使用lrelease工具发布翻译文件的二进制文件,这样在程序运行时载入会大大的加快速度。使用方式是#lrelease ***.pro,这个工具会提示你多少语句被翻译,多少被忽略了等。生成的文件是 ***.qm,于同名的 ***.ts只是换了一个扩展名。而这才是我们程序需要使用到的文件。

5、使用***.qm文件。关于这个,我想还是摘抄书上的原文来说明一下:

切换语言分为两种情况:

1. 程序载入的时候,根据当前的区域设置,自动选择语言包(.qm),即可;

2. 要求在程序运行过程中动态切换语言,需要
 
第一种情况,一般在main函数中程序启动的部分加入如下代码:

  1. connect(langCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLang(int)) );    
  2. // 载入不同的语言包    
  3. void WizarDialog::changeLang( int langIndex )    
  4. {    
  5.   QTranslator *translator = new QTranslator(qApp);    
  6.   switch( langCombo->currentIndex() ){    
  7.   case 0:    
  8.     translator->load(QString("./language/pt_BR"));    
  9.     break;    
  10.   case 1:    
  11.     translator->load(QString("./language/en_US"));    
  12.     break;    
  13.   case 2:    
  14.     translator->load(QString("./language/zh_CN"));    
  15.   default:    
  16.     break;    
  17.   }    
  18.   qApp->installTranslator( translator );    
  19.   this->initGUI();    
  20. }   
  21. // initGUI() 中会有大量的tr函数    
  22. void WizarDialog::initGUI()    
  23. {    
  24.   this->setWindowTitle(tr("RTA04W"));    
  25.   /* ...... */    
  26. }  

这两种情况,也可以复合起来用。

需要说明的时, 一般我们使用设计器来设计界面UI,也就是程序源码中我们看到的 ***.ui文件,在载入翻译器后,我们应该调用 ui->retranslateUi() ,这个函数实际上就是把界面控件的text重新载入一遍,可以在 ui_***.cpp中看到该函数的实现。

5、在帮助文档中,关于 QTranslator::load有这样一句话。

The data is not copied. The caller must be able to guarantee that data will not be deleted or modifiled.

这段话明确的说明了,QTranslator在load以后,并没有把qm文件中的数据拷贝一份,而是在需要的时候去查询字符串。如果qm在这期间被删除或修改,对程序都是有影响的。扩展开来,QTranslator必须保证要一直有效,如果在函数中定义的局部变量,函数结束后就自动释放掉了,那么翻译工作就不能正常进行。所以建议在private中定义个成员变量 QTranslator* app_translator;来确保整个翻译工作的正确性。

小结:Qt 界面实现多国语言的切换实例的内容介绍完了,希望本篇文章能够对你有所帮助!!!

---------------------------------------------------------------------------------------------------------------------------

QT学习小技巧

来源 http://software.intel.com/zh-cn/blogs/2011/10/31/qt-3

分享在比赛中写代码时,发现的几个对写程序很有用的小段代码,虽小但是在我的软件中帮了我很大忙。这些代码可以在程序和软件开发中直接使用,会为你的程序开发介绍很多麻烦。仅是个人之见,如有不符之处,请拍砖。
第一段:主要的功能是解决中文显示问题,这三段有时一段即可,有时需要三段都得写。为了省事,我一般是三段一起写,我们队在软件开发中把这三段放在了main函数中。
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));实例:
int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
QApplication app(argc, argv);
setup setupwindow;
setupwindow.show();
return app.exec();
}
这样在软件开发过程,和程序编写过程中几乎所有的乱码问题全部可以不用担心了,也不必在花心思去专门注意了(我在软件开发中百试百灵,只是个人经验)。
第二段:主要用来解决图片、文件等默认命名重复问题。我们队在开发中考虑用时间作为文件的默认名字,某一时刻的时间是绝对不会重复的,所以命名的文件也绝对不会重复,也绝不会发生覆盖导致文件、图片问题
实例应用:
QString str = QTime().currentTime().toString();
picname= QString(tr("IMG%1%2%3"))
.arg(QDate().currentDate().year()%100)
.arg(QDate().currentDate().month())
.arg(QDate().currentDate().day(),2)
+str.mid(0,2)+str.mid(3,2)+str.mid(6,2)+".jpg";
fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
"/home/meego/Pictures/"+picname,
tr("Images (*.jpg *.png *.xpm *.jpg)"));
第三段:为软件界面设计背景图片
代码:
QPalette palette; palette.setBrush(QPalette::Background,QBrush(QPixmap(":/img/butterflynew.jpg")));
this->setPalette(palette);
只需对":/img/butterflynew.jpg" 进行简单的修改和替换即可使你的软件或程序界面变成你所想要的效果。
还有就是在软件设计时我们采用两种方式,一种是纯粹代码完成,另一种是控件的拖放加适当的代码添加。在这个过程中,我们发现在代码编写和添加中,纯粹的控件拖放可以帮我们完成很多工作。具体实现方法如下:
新建一个QT GUI Application 建完后会默认的程序组成如下图所示:
(由于网速等原因图片一直加不进来,创建时只要一直点默认的按钮即可)
我们可以在UI文件中进行控件的拖放和组装。然后点击编译,可以不用运行,但是若要看效果可以运行下。回到mainwindow.cpp看头文件会看到#include "ui_mainwindow.h"将光标放到#include "ui_mainwindow.h" 中间,然后点击F2,程序界面会跳转到ui_mainwindow.h中,在这里你可以看到你所拖动的控件如何用纯的代码去实现。这一方法,在对控件的位置定义中节省了很多时间。
以上是我在学习QT中的一点小收获小总结,有可能有失误的地方,请拍砖!
南昌大学 xluren@126.com 队名:Ncu0901 夏宝宁