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

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

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

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

  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()函数中是怎样的

  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文件前面贴过,不再重复

  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

动态语言切换(续)-designer中的retranslateUi(带源码)的更多相关文章

  1. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  2. 在Xcode中使用Git进行源码版本控制

    http://www.cocoachina.com/ios/20140524/8536.html 资讯 论坛 代码 工具 招聘 CVP 外快 博客new 登录| 注册   iOS开发 Swift Ap ...

  3. 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码

    转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...

  4. 动态方式破解apk进阶篇(IDA调试so源码)

    动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/qq_21051503/article/details/74907449 下面就说关于在IDA中And ...

  5. RocketMQ中Broker的启动源码分析(一)

    在RocketMQ中,使用BrokerStartup作为启动类,相较于NameServer的启动,Broker作为RocketMQ的核心可复杂得多 [RocketMQ中NameServer的启动源码分 ...

  6. Springboot中mybatis执行逻辑源码分析

    Springboot中mybatis执行逻辑源码分析 在上一篇springboot整合mybatis源码分析已经讲了我们的Mapper接口,userMapper是通过MapperProxy实现的一个动 ...

  7. Orchard CMS中如何打包不带源码的模块

    在Orchard CMS的官网已经提供了文档说明如何打包,但是如果使用它的打包方式,打好的nuget包是带源代码的.如果是为开源系统写模块,不需要关注源代码是否可见.但是如果是用Orchard CMS ...

  8. Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使 ...

  9. ThreadPoolExecutor的应用和实现分析(中)—— 任务处理相关源码分析 线程利用(转)

    前面一篇文章从Executors中的工厂方法入手,已经对ThreadPoolExecutor的构造和使用做了一些整理.而这篇文章,我们将接着前面的介绍,从源码实现上对ThreadPoolExecuto ...

随机推荐

  1. Docker 管理工具的选择:Kubernetes 还是 Swarm?

    [编者的话]选择Kubernetes 或者 Swarm 就像在将 Linux 桌面发行版的范围缩小到两个后选出一个最喜欢的.哪个更满足你的需要如何才是决定因素. [3 天烧脑式基于Docker的CI/ ...

  2. java io包File类

    1.java io包File类, Java.io.File(File用于管理文件或目录: 所属套件:java.io)1)File对象,你只需在代码层次创建File对象,而不必关心计算机上真正是否存在对 ...

  3. YAML说明

    YAML说明 https://www.cnblogs.com/songchaoke/p/3376323.html XML的简化

  4. Swift开发教程--怎样使UITableViewController背景透明

    self.tableView.backgroundView? .backgroundColor = UIColor.clearColor(); self.tableView.backgroundCol ...

  5. 安装MYSQL错误“conflicts with file from package mysql-libs-*” 解决方法

    安装MYSQL的时候时: 错误现象: [root@localhost opt]# rpm -ivh MySQL-server-5.5.32-1.el6.x86_64.rpm Preparing... ...

  6. iOS 自己主动登录,登录过程中一直显示载入页

    iOS开发中 假设client做的人性化一点肯定会考虑自己主动登录 事实上原理非常easy,就是再首次登录成功之后将username和password存入userdefault 下次登录的时候推断us ...

  7. [jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)

    题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注: ...

  8. sicily 1342 开心的金明 (动规)

    刷一下简单的背包问题 以下为代码: //1342. 开心的金明 #include <iostream> using namespace std; #define MAX(a,b) a> ...

  9. NOIP 2012 T2 国王游戏 (贪心+高精)

    思路: 呃呃网上那么多题解写得都不错-.. 就是高精 巨坑... 这里展出的是任氏高精(纯自己yy滴) //By SiriusRen #include <cstdio> #include ...

  10. 为什么同样的数据,俩人生成的obj和bin文件不一样

    http://bbs.csdn.net/topics/270055083 编译器编译的时候可能有些东西依赖时间,或许是优化的原因,如果可以,换个编译器试试,或许两次编译的时候,强制把系统时间调成一个看 ...