您的位置:首页 > 产品设计 > UI/UE

详解QUiLoader 动态加载.ui文件

2016-01-04 14:57 537 查看
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头文件

[cpp] view plaincopyprint?

#include <QtUiTools/QtUiTools>

4.2核心代码

[cpp] view plaincopyprint?

//传入UI文件路径

QString uifilePath = "./demo.ui";

QUiLoader uiLoader;

QFile file(uifilePath);

file.open(QIODevice::ReadOnly);

//setWorkingDirectory 设置工作目录:若UI文件中引用了其他目录的资源,可在此处设置工作目录

const QDir &workdir(uifileWorkPath);

uiLoader.setWorkingDirectory(workdir);

//加载UI文件

QWidget* getWidget = uiLoader.load(&file,parent);

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


5.元素查找

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

[cpp] view plaincopyprint?

//1.查找名称为“读写的”QPushButton

QPushButton *getButton = getWidget->findChild<QPushButton *>("读写");

//2.查找所有QPushButton

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()的槽,你只要实现该槽函数就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: