http://blog.chinaunix.net/uid-13838881-id-3652523.html
1.适用情况:
	动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui 文件。不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序运行过程中需要用到UI文件时,用 QUiLoader 加载.ui文件,达到相同目的。
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.适用环境:
	1.UI文件是程序运行中途创建生成的,在同程序的其他地方调用,没法进行uic。
	2.前端设计和功能实现相分离,前端设计人员和功能实现人员只要事前沟通好相关组件的名称等,就可以进行独立开发,能提高效率。
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.配置信息:
	3.1若使用的.pro文件生成,需要在.pro文件中需要加上
TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .
CONFIG += uitools
# Input
FORMS += demo.ui
SOURCES += uiloader.cpp

3.2如使用的是VS开发工具,需要添加QtUiToolsd.lib/QtUiTools.lib 库

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4.代码实现:

4.1头文件

  1. #include <QtUiTools/QtUiTools>

4.2核心代码

  1. //传入UI文件路径
  2. QString uifilePath = "./demo.ui";
  3. QUiLoader uiLoader;
  4. QFile file(uifilePath);
  5. file.open(QIODevice::ReadOnly);
  6. //setWorkingDirectory 设置工作目录:若UI文件中引用了其他目录的资源,可在此处设置工作目录
  7. const QDir &workdir(uifileWorkPath);
  8. uiLoader.setWorkingDirectory(workdir);
  9. //加载UI文件
  10. QWidget* getWidget = uiLoader.load(&file,parent);
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

5.元素查找

对于UI上的各个组件,可用下面方法进行查找

  1. //1.查找名称为“读写的”QPushButton
  2. QPushButton *getButton = getWidget->findChild<QPushButton *>("读写");
  3. //2.查找所有QPushButton
  4. QList<QPushButton *> getAllPButtons = getWidget->findChildren<QPushButton *>();
   ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

6.信号槽机制

connect(getButton,SIGNAL(clicked()),this,SLOT(setButtonClicked()));处理ui_setButton的clicked()信号。
但拜元对象机制所赐,还有一劳永逸的方法
QMetaObject::connectSlotsByName(this);该函数会将this的所有子对象都连接上一个槽(slot),槽的命名规范为
on_对象名_信号名,比如上面的setButton的clicked(),将会生成一个on_setButton_clicked()的槽,你只要实现该槽函数就可以了。

详解QUiLoader 动态加载.ui文件的更多相关文章

  1. QUiLoader 动态加载.ui文件

    动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui 文件.不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序运行过程中需要用到UI文件时,用 QUiLoader ...

  2. QT运行时加载UI文件

      写QT程序里运行时加载UI文件,代码如下: 点击(此处)折叠或打开 #include "keyboard.h" #include <QtUiTools> #incl ...

  3. 如何按需动态加载js文件

    JavaScript无非就是script标签引入页面,但当项目越来越大的时候,单页面引入N个js显然不行,合并为单个文件减少了请求数,但请求的文件体积却很大.这时候最好的做法就是按需引入,动态引入组件 ...

  4. Java_Java中动态加载jar文件和class文件

    转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...

  5. Android应用安全之外部动态加载DEX文件风险

    1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...

  6. js动态加载css文件和js文件的方法

    今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...

  7. 两种动态加载JavaScript文件的方法

    两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...

  8. NGUI学习笔记(四):动态加载UI和NGUI事件

    动态加载UI 我们进入一个场景后,如果将这个场景所有可能用到的UI都直接放在场景中做好,由于要在进入场景时就部署好所有的UI对象,那么当UI对象较多时会碰到的问题是:1.初始化场景会产生非常明显的卡顿 ...

  9. 动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数

    动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数, 在很多场景下,我们需要在动态加载JS文件的时候,根据加载的状态来进行后续的操作,需要在JS加载成功后,执行另一方法,这个方法是依托在加 ...

随机推荐

  1. PieTTY

    PieTTY 用 pietty 連上主機時 鍵盤右方數字鍵 (keypad) 失效的問題 用 pietty 連上主機時 鍵盤右方數字鍵 (keypad) 失效的問題 應該滿多人用 pietty 連上程 ...

  2. UAC新解(有非正常手段可以绕过)

    360第一次注册是需要弹,可是以后就不弹了开机自启动不弹框,开机自启动不弹框 服务是system权限再说一句,一般程序也不需要过UAC系统启动项白名单.UAC有一个白名单机制.还有UAC也可以通过wu ...

  3. QString内部仍采用UTF-16存储数据且不会改变(一共10种不同情况下的编码)

    出处:https://blog.qt.io/cn/2012/05/16/source-code-must-be-utf-8-and-qstring-wants-it/ 但是注意,这只是QT运行(Run ...

  4. hduAnother Graph Game

    http://acm.hdu.edu.cn/showproblem.php?pid=4647 很扯的一题 将每条边的一半权值分给它所连的两个结点 #include <iostream> # ...

  5. rebuild过程

    /** The class defining a handle to an Innodb table */ class ha_innobase: public handler { row_prebui ...

  6. BZOJ3530: [Sdoi2014]数数

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 322  Solved: 188[Submit][Status] ...

  7. .Net 垃圾回收机制原理(一)

    英文原文:Jeffrey Richter 编译:赵玉开 链接:http://www.cnblogs.com/yukaizhao/archive/2011/11/23/dot_net_GC_1.html ...

  8. 图文教您轻松学会用PS设计制作名片

    图文教您轻松学会用PS设计制作名片 http://jingyan.baidu.com/article/49711c614e7370fa441b7ca3.html

  9. C# VS2010中,用微软自带的System.Data.OracleClient来连接Oracle数据库

    由于微软在.Net框架4.0中已经决定撤销使用System.Data.OracleClient,造成在VS2010中无法连接Oracle数据库,但它还依旧存在于.Net架构中,我们可以通过自己引用 C ...

  10. Oracle将英文字符集数据转换成中文

    转换背景:老系统数据为英文字符集,需要将老数据(Oracle 8i)转换到oracle 10g(中文字符集)中 思路:先将老数据从8i的数据库中导出,导出的数据库文件为英文字符集,再将10g的数据库改 ...