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

本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途。 谢谢合作。
原文链接:动态语言切换(续)-designer中的retranslateUi(带源码)

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

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

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

[xhtml] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <ui version="4.0">  
  3. <class>LangForm</class>  
  4. <widget class="QWidget" name="LangForm">  
  5. <property name="geometry">  
  6. <rect>  
  7. <x>0</x>  
  8. <y>0</y>  
  9. <width>378</width>  
  10. <height>110</height>  
  11. </rect>  
  12. </property>  
  13. <property name="windowTitle">  
  14. <string>Lang Switch</string>  
  15. </property>  
  16. <layout class="QHBoxLayout" name="horizontalLayout_2">  
  17. <item>  
  18. <layout class="QHBoxLayout" name="horizontalLayout">  
  19. <item>  
  20. <widget class="QPushButton" name="EnButton">  
  21. <property name="text">  
  22. <string>Display English</string>  
  23. </property>  
  24. </widget>  
  25. </item>  
  26. <item>  
  27. <widget class="QPushButton" name="CnButton">  
  28. <property name="text">  
  29. <string>Display Chinese</string>  
  30. </property>  
  31. </widget>  
  32. </item>  
  33. </layout>  
  34. </item>  
  35. </layout>  
  36. </widget>  
  37. <resources/>  
  38. <connections/>  
  39. </ui>  

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

[cpp] view plain copy
 
  1. void retranslateUi(QWidget *LangForm)  
  2. {  
  3.     LangForm->setWindowTitle(  
  4.         QApplication::translate("LangForm", "Lang Switch", 0, QApplication::UnicodeUTF8));  
  5.     EnButton->setText(  
  6.         QApplication::translate("LangForm", "Display English", 0, QApplication::UnicodeUTF8));  
  7.     CnButton->setText(  
  8.         QApplication::translate("LangForm", "Display Chinese", 0, QApplication::UnicodeUTF8));  
  9.     Q_UNUSED(LangForm);  
  10. // retranslateUi  

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

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

[cpp] view plain copy
 
  1. //widget.h  
  2. #ifndef WIDGET_H  
  3. #define WIDGET_H  
  4. #include <QWidget>  
  5. #include "ui_hello.h"  
  6. class Widget:public QWidget,public Ui::LangForm  
  7. {  
  8. Q_OBJECT  
  9. public:  
  10.     Widget(QWidget *parent=0);  
  11. private slots:  
  12.     void loadChinese();  
  13.     void loadEnglish();  
  14. private:  
  15.     bool lang_is_english;  
  16. };  
  17. #endif  
  18. //widget.cpp  
  19. #include <QtGui>  
  20. #include "widget.h"  
  21. Widget::Widget(QWidget *parent)  
  22. :QWidget(parent)  
  23. {  
  24.     setupUi(this);  
  25.     connect(CnButton,SIGNAL(clicked()),SLOT(loadChinese()));  
  26.     connect(EnButton,SIGNAL(clicked()),SLOT(loadEnglish()));  
  27.     lang_is_english=true;  
  28. }  
  29. void Widget::loadChinese()  
  30. {  
  31.     if(!lang_is_english)  
  32.     return;  
  33.     QTranslator translator;  
  34.     translator.load("i18n_zh");  
  35.     qApp->installTranslator(&translator);  
  36.     lang_is_english=false;  
  37.     retranslateUi(this);  
  38. }  
  39. void Widget::loadEnglish()  
  40. {  
  41.     if(lang_is_english)  
  42.     return;  
  43.     QTranslator translator;  
  44.     qApp->installTranslator(&translator);  
  45.     lang_is_english=true;  
  46.     retranslateUi(this);  
  47. }  
  48. //main.cpp  
  49. #include <QApplication>  
  50. #include <QWidget>  
  51. #include "widget.h"  
  52. int main(int argc, char *argv[])  
  53. {  
  54.     QApplication app(argc,argv);  
  55.     Widget *ww=new Widget;  
  56.     ww->show();  
  57.     return app.exec();  
  58. }  
  59. //i18n.pro  
  60. TEMPLATE = app  
  61. TARGET =  
  62. DEPENDPATH += .  
  63. INCLUDEPATH += .  
  64. # Input  
  65. HEADERS += widget.h  
  66. FORMS += hello.ui  
  67. SOURCES += main.cpp widget.cpp  
  68. TRANSLATIONS += i18n_zh.ts  

http://blog.csdn.net/cuteqt/article/details/5909770

原文地址:https://www.cnblogs.com/findumars/p/4139020.html