本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途。 谢谢合作。
原文链接:动态语言切换(续)-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. RabbitMQ学习总结(6)——消息的路由分发机制详解

    一.Routing(路由) (using the Java client) 在前面的学习中,构建了一个简单的日志记录系统,能够广播所有的日志给多个接收者,在该部分学习中,将添加一个新的特点,就是可以只 ...

  2. poj3249 Test for job 【图的DAG dp】

    #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...

  3. JavaScript 没有函数重载&amp;Arguments对象

    对于学过Java的人来说.函数重载并非一个陌生的概念,可是javaScript中有函数重载么...接下来我们就进行測试 <script type="text/javascript&qu ...

  4. 《UNIX环境高级编程》读书笔记之系统数据文件和信息(1)

    1.UNIX系统口令文件包括了下图所看到的的各字段,这些字段包括在<pwd.h>中定义的passwd结构体中 POSIX定义了两个获取口令文件项的函数. 在给出用户登录名或用户ID后.这两 ...

  5. Android This Activity already has an action bar supplied by the window decor

    This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_ ...

  6. Android Studio 修改注释模板中的${USER}变量以及修改默认的头部注释

    引言 通常我们创建类文件都会自动生成一段头部注释. 有时候这不是我们想要的效果. 它默认是Created By XXX. 而我们要的是@author XXX. 而且这里面的XXX是系统的的用户名,不一 ...

  7. m_Orchestrate learning system---二十二、html代码如何变的容易

    m_Orchestrate learning system---二十二.html代码如何变的容易 一.总结 一句话总结:(结构清晰之后构建页面就变得超级容易了)(多做多用一下子就熟了) 1.文章显示页 ...

  8. 模板层 Template

    每一个 Web 框架都需要一种很便利的方法用于动态生成 HTML 页面. 最常见的做法是使用模板. 模板包含所需 HTML 页面的静态部分,以及一些特殊的模版语法,用于将动态内容插入静态部分. 说白了 ...

  9. CSS3中的transition

    W3C标准中对CSS3的transition是这样描述的: CSS的transition允许CSS的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击,获得焦点,被点击或对元素任何改变中触发, ...

  10. WebSocket 前端封装

    $.extend({ socketWeb:function (opt) { if("WebSocket" in window){ var setting=$.extend({ ur ...