前篇动态语言切换文中提到了动态切换语言的一点技巧。其实在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
联系客服