Chinaunix首页 | 论坛 | 博客
  • 博客访问: 538804
  • 博文数量: 78
  • 博客积分: 1913
  • 博客等级: 上尉
  • 技术积分: 829
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-14 21:29
文章分类

全部博文(78)

文章存档

2011年(27)

2010年(26)

2009年(20)

2008年(5)

我的朋友

分类:

2010-05-15 16:13:37


Qt在应用程序的国际化方面做了很多工作 ,Qt可以实现在运行时动态改变应用程序的界面语言,下面以一个简单的例子一步一步教你如何实现之.

Qt是跨平台的开发环境,这里以MAC上的QT SDK4.6.2为例,您可以在其它平台下按此操作步骤一样没问题.

好的,让我们开始吧:

    1. 首先我们创建一个Qt4 Gui Application

    2. 去掉那个讨厌的ToolBar, 加入如下控件:

      QComboBox 对应的名字(ID) changeCombox
      QTextEdit --------------------- infoTxt
      QLabel ----------------------- tipTxt

      双击QComboBox, changeCombox这个控件加入如下条目(Items)

注意我们把transatable去掉,意为我们将不会动态改变combobox里面的语言,如果改combobox里面的内容,则在动态切换语言时造成combobox changedindex紊乱.因为切换语言的过程中,combobox里面的内容被动态更改.

    1. 更改构造函数:

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

      }

    2. 在此之前,我们先要翻译我们程序运行时所要用的语言,具体如下 :

    • 打开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文件为二进制文件,程序换语言时就从这里面查找.

    1. 好了,现在我们加上一个qrc文件, File->New File or Project, 选择qrc文件. 首先add prefix,我们就用/好了.add files,将三个qm文件选上, 保存.

    2. changeCombox添加slot:
      combobox上右键:Go to slots: 选择:on_changeCombox_currentIndexChanged(int)信号.

    1. 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 便可实现运行时动态改变语言.

    1. 效果截图

从中,你可以看到,textEdit里面的东西 没有 被翻译,因为这里面的文本没有 在ui->retranslateUi(this);这个函数里面实现.你可以重写这个函数.

这里还有一点要注意的是,因为我们把qm文件打包在qrc文件里,所以当我们生成应用程序时,qm文件被打包到exe/app内部去了.如果我们想通过动态改qm文件而不用重新编译应用程序,我们可以把qm文件放在外面独立目录中.

阅读(5478) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~