前篇动态语言切换文中提到了动态切换语言的一点技巧。其实在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_OBJECT public: 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.pro TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += widget.h FORMS += hello.ui SOURCES += main.cpp widget.cpp TRANSLATIONS += i18n_zh.ts