动态语言切换(续)-designer中的retranslateUi(带源码)

来源:互联网 发布:淘宝店铺女装女鞋介绍 编辑:程序博客网 时间:2024/05/16 07:01

前篇动态语言切换文中提到了动态切换语言的一点技巧。其实在desigener设计UI的时候也考虑到了这一点。

在将xxx.ui文件转换为ui_xxx.h文件的系统,uic工具为.h文件添加了retranslateUi(QWidget *) 这样的一个函数,就是专门做的一个重新设>置翻译文件的操作,不需要关闭或者隐藏任何一个窗体。

我们来看一个简单的hello.ui文件

 

<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"><class>LangForm</class><widget class="QWidget" name="LangForm"><property name="geometry"><rect><x>0</x><y>0</y><width>378</width><height>110</height></rect></property><property name="windowTitle"><string>Lang Switch</string></property><layout class="QHBoxLayout" name="horizontalLayout_2"><item><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QPushButton" name="EnButton"><property name="text"><string>Display English</string></property></widget></item><item><widget class="QPushButton" name="CnButton"><property name="text"><string>Display Chinese</string></property></widget></item></layout></item></layout></widget><resources/><connections/></ui>

这个文件在一个QWidget和两个QPushButton里都有和text相关的属性。我们来看这3个text在ui_hello.h中retranslateUi()函数中是怎样的

void retranslateUi(QWidget *LangForm){    LangForm->setWindowTitle(        QApplication::translate("LangForm", "Lang Switch", 0, QApplication::UnicodeUTF8));    EnButton->setText(        QApplication::translate("LangForm", "Display English", 0, QApplication::UnicodeUTF8));    CnButton->setText(        QApplication::translate("LangForm", "Display Chinese", 0, QApplication::UnicodeUTF8));    Q_UNUSED(LangForm);} // retranslateUi

所以在写动态语言切换程序时,只要把翻译语言加载进来,然后再调用retranslateUi()函数就可以实现用designer设计ui文件的动态无缝切换
了。

演示代码如下: hello.ui文件前面贴过,不再重复

//widget.h#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include "ui_hello.h"class Widget:public QWidget,public Ui::LangForm{Q_OBJECTpublic:    Widget(QWidget *parent=0);private slots:    void loadChinese();    void loadEnglish();private:    bool lang_is_english;};#endif
//widget.cpp#include <QtGui>#include "widget.h"Widget::Widget(QWidget *parent):QWidget(parent){    setupUi(this);    connect(CnButton,SIGNAL(clicked()),SLOT(loadChinese()));    connect(EnButton,SIGNAL(clicked()),SLOT(loadEnglish()));    lang_is_english=true;}void Widget::loadChinese(){    if(!lang_is_english)    return;    QTranslator translator;    translator.load("i18n_zh");    qApp->installTranslator(&translator);    lang_is_english=false;    retranslateUi(this);}void Widget::loadEnglish(){    if(lang_is_english)    return;    QTranslator translator;    qApp->installTranslator(&translator);    lang_is_english=true;    retranslateUi(this);}
//main.cpp#include <QApplication>#include <QWidget>#include "widget.h"int main(int argc, char *argv[]){    QApplication app(argc,argv);    Widget *ww=new Widget;    ww->show();    return app.exec();}
//i18n.proTEMPLATE = appTARGET =DEPENDPATH += .INCLUDEPATH += .# InputHEADERS += widget.hFORMS += hello.uiSOURCES += main.cpp widget.cppTRANSLATIONS += i18n_zh.ts