分类:
2010-05-15 16:13:37
Qt在应用程序的国际化方面做了很多工作 ,Qt可以实现在运行时动态改变应用程序的界面语言,下面以一个简单的例子一步一步教你如何实现之.
Qt是跨平台的开发环境,这里以MAC上的QT SDK4.6.2为例,您可以在其它平台下按此操作步骤一样没问题.
好的,让我们开始吧:
首先我们创建一个Qt4 Gui Application
去掉那个讨厌的ToolBar, 加入如下控件:
QComboBox
对应的名字(ID)为
changeCombox
QTextEdit --------------------- infoTxt
QLabel ----------------------- tipTxt
双击QComboBox,
为changeCombox这个控件加入如下条目(Items)
注意我们把transatable去掉,意为我们将不会动态改变combobox里面的语言,如果改combobox里面的内容,则在动态切换语言时造成combobox 的 changedindex紊乱.因为切换语言的过程中,combobox里面的内容被动态更改.
更改构造函数:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->infoTxt->setText(tr("Hello, moon.","This is a Text Edit Control.")); this->setWindowTitle(tr("Translate test", "windowTitle")); } |
在此之前,我们先要翻译我们程序运行时所要用的语言,具体如下 :
打开Muti_Language_APP.pro文件,加入:
TRANSLATIONS
+= US.ts ZH.ts JAN.ts
打开终端,
转到你的工程目录下,
输入lupdate
Muti_Language_APP.pro, 将会显示如下结果:
Updating 'US.ts'... Found 8 source text(s) (8 new and 0 already existing) Updating 'ZH.ts'... Found 8 source text(s) (8 new and 0 already existing) Updating 'JAN.ts'... Found 8 source text(s) (8 new and 0 already existing) |
这个时候会在工程目录下生成 US.ts ZH.ts JAN.ts三个文件,这三个文件为XML格式,其实记录的是需要翻译的文本,可以任意打开一个看看.我们现在打开Linguist工具(QT自带的语言翻译工具),将三个.ts文件拖入,相信你会知道如何进行下一步操作.
当你翻译好后,请选择File->Save All, File->Release All,这时会在项目目录下生成 我们最终所需要的三个qm文件,qm文件为二进制文件,程序换语言时就从这里面查找.
好了,现在我们加上一个qrc文件, File->New File or Project, 选择qrc文件. 首先add prefix,我们就用/好了.再add files,将三个qm文件选上, 保存.
为changeCombox添加slot:
在combobox上右键:Go
to slots: 选择:on_changeCombox_currentIndexChanged(int)信号.
在mainwindow.cpp中加入编写slot事件代码:
void MainWindow::on_changeCombox_currentIndexChanged(int lang) { static QTranslator *translator; QString language; if (translator) { qApp->removeTranslator(translator); delete translator; translator = NULL; }
translator = new QTranslator(); switch(lang) { case 0: language = "US";break; case 1: language = "ZH";break; case 2: language = "JAN";break; }
if (translator->load(":/" + language + ".qm") == FALSE) { //handle error here }
qApp->installTranslator(translator); } |
利用QTranslator 便可实现运行时动态改变语言.
效果截图
从中,你可以看到,textEdit里面的东西 没有 被翻译,因为这里面的文本没有 在ui->retranslateUi(this);这个函数里面实现.你可以重写这个函数.
这里还有一点要注意的是,因为我们把qm文件打包在qrc文件里,所以当我们生成应用程序时,qm文件被打包到exe/app内部去了.如果我们想通过动态改qm文件而不用重新编译应用程序,我们可以把qm文件放在外面独立目录中.