zoukankan      html  css  js  c++  java
  • 动态语言切换(续)-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

  • 相关阅读:
    How to Setup a Private Proxy Server on EC2 in Under 10 Minutes
    How to Create a Cron Job (Scheduled Task) for Your Website or Blog
    NPM, BOWER, GIT, AND BASH PROXY CONFIGURATIONS
    Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本
    Proguard breaking audio file in assets or raw
    SOCKSify Ruby
    UNIX / Linux: 2 Ways to Add Swap Space Using dd, mkswap and swapon
    窗体之间传值的方法
    扩展方法,
    反射 type 的基本用法,动态加载插件
  • 原文地址:https://www.cnblogs.com/findumars/p/4139020.html
Copyright © 2011-2022 走看看