Qt/C++使用QUiLoader动态加载ui资源文件

2023-11-18


动态对话框

动态对话框(dynamic dialog)就是在程序运行时使用的从Qt设计师的.ui文件创建而来的那些对话框。动态对话框不需要通过uic把 .ui文件转换成C++代码,相反,它是在程序运行的时候使.用QUiLoader 类载人该文件的。

使用场景

动态对话框使不重新编译应用程序而可以改变窗体布局的做法成为可能。动态对话框也同样可用于创建小型终端应用程序,这些程序只有一个内置的前端窗体,并且只是在需要的时候才会去创建所有的其他窗体。还可以使得界面设计和逻辑的相互分离,前后端同时开发。效率更高。

注意事项

该功能在Qt4中就引入了,如果你是在Qt5或者更高版本还需要配置Qt5UiTools.lib库。我的路径为xx\Qt\5.15.2\msvc2019_64\lib\Qt5UiToolsd.lib。关于加载静态库这里不再赘述,直接贴出代码,如果你也是用qt create开发那么你只需要修改路径就可以使用了。

LIBS += -LD:/Qt/5.15.2/msvc2019_64/lib/ -lQt5UiTools

动态对话框加载

加载需要用到QUiLoader这个类,通过load方法将文件加载进去。通过获取返回值来判断是否加载成功,然后就可以做出对应的处理。

#include <QtUiTools/QUiLoader>
	QUiLoader uiloader;
    QFile file("./testDialog.ui");
    QWidget* testDialog = uiloader.load(&file);
    if(testDialog != nullptr)
    {
        testDialog->show();
    }

获取动态对话框的控件对象

可以使用QObject::findChild\<T>()来访问这个窗体中的各个控件。

说明:findChild\<T>()函数是一个模板成员函数,它可以返回与给定的名字和类型相匹配的子对象。

    QPushButton* btn = testDialog->findChild<QPushButton*>("pushButton");
    if(btn != nullptr)
    {
        qDebug() << btn->text();
        btn->setEnabled(false);
    }

与动态对话框建立关联

还可以使用connect关联动态对话框的控件。在使用上与正常的ui文件没有任何区别。

下面这段会让我点击该按钮,让"林夕07"这个按钮解除禁用。

    btn2 = testDialog->findChild<QPushButton*>("pushButton_2");
    if(btn2 != nullptr)
    {
        connect(btn2, &QPushButton::clicked, this, [&](){ btn->setEnabled(true);});
    }

左边是点击"我改变了"的按钮前,右侧是点击后,可以看到"林夕07"按钮已解除禁用状态了。
在这里插入图片描述

动态修改ui资源文件效果测试

下面的DynamicDialog.exe是测试程序,testDialog.ui是我们需要动态加载的ui文件。
在这里插入图片描述
点击DynamicDialog.exe测试效果
在这里插入图片描述

然后我将testDialog.ui的内容进行修改再次测试。
在这里插入图片描述
可以看到我们原本的控件位置都移动了,甚至我们还添加了新的控件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt/C++使用QUiLoader动态加载ui资源文件 的相关文章

随机推荐

  • 如何屏蔽某网站

    博主用电脑的时候用一会儿总是控制不住就刷起了知乎 然后在蹉跎中度过了美好的时光 于是决定屏蔽知乎等让我分心的网站 希望能够专注于眼前的事 此方法治标不治本 因为能屏蔽也能让它恢复 因此想要真正不分心还得提高自制力 我的思路是修改host文件
  • 网页一键生成app软件_工程人必须拥有的4个自动生成软件,操作简单,一键输入直接生成...

    工程人必须拥有的4个自动生成软件 操作简单 一键输入直接生成 还在为写技术交底而头疼吗 还在为经常熬夜而烦恼吗 还在为没有好的模板而郁闷吗 这些都是工程人的通病 作为工程人深有同感 如果有一个能一键操作 就能自动生成技术交底的软件 是不是很
  • 【华为OD机试真题2023B卷 JAVA&JS】宜居星球改造计划

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 宜居星球改造计划 知识点广搜 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 2XXX年 人类通过对火星的大气进行宜居改造分析 使得火星已在理论上具备人类宜居的条件 由于
  • C# 监听http请求

    直接上代码 public partial class FrmHome Form HttpListener verifyHttplisten private object listenLocker new object Thread Thre
  • vscode go mod报错(萌新)

    出现如下报错信息 gopls was not able to find modules in your workspace When outside of GOPATH gopls needs to know which modules y
  • Arduino 运行 Rust

    项目设置 首先 我们将通过运行来创建一个新的 cargo 项目 我们需要为 avr 目标 目标三元组 avr unknown unknown 交叉编译我们的项目 为此 我们需要切换到 nightly 工具链 因为一些依赖包使用不稳定的功能来
  • 浅谈Java平台无关性

    为什么Java要支持平台无关性 众所周知 Java是平台无关的语言 那么Java为什么要支持平台无关性 总结一下 有如下几点 支持多变的网络环境 如今是一个互联网的时代 网络将各种各样的计算机和设备连接起来 比如网络连接了windows的P
  • 仪表放大器 电流的检测

    完美的减法运算放大电路 引入缓冲器 固定增益的双运放仪表放大器 12倍放大 电流的检测 错误接法 正确接法
  • LVS的原理

    一 LVS的介绍 linux virtual server简称LVS Internet的快速增长使多媒体网络服务器面对的访问数量快速增加 服务器需要具备提供大量并发访问服务的能力 因此对于大负载的服务器来讲 CPU I O处理能力很快会成为
  • 最火爆的开源流式系统Storm vs 新星Samza

    分布计算系统框架 按照数据集的特点来说 主要分为data flow和streaming两种 data flow主要是以数据块为数据源来处理数据 代表有 MR Spark等 我称作它们为大数据 而streaming主要是处理单位内得到的数据
  • Python每日一题 - 9 - 暂停5秒输出问题

    前言 本人因喜欢python和c语言等程序设计语言 希望能够在这里和大家共同学习共同进步 因个人喜好喜欢做题 所以想出一个系列专栏关于python的习题专集 希望大家喜欢 希望能在这里分享学习的一些知识碎片 接触时间不长 如果文章有任何错误
  • java中的八种数据类型、变量与常量

    内存空间所占字节数 8位等于1字节 数值型 1 整数类型 byte 1 short 2 int 4 long 8 2 浮点类型 float 4 double 8 字符型 char 2 布尔型 boolean 1或4 取值范围 byte 12
  • vue3.0全局引入sass

    在项目开发过程中 有一些共同的sass样式我想抽出封装到一个文件 利用sass的mixin语法来封装变量 但是在这个过程中一直会报错 先是识别不出来 mixin 和 include 后来是报错sass等一些插件的问题 后来是这样解决的 首先
  • C++ 简介

    C c plus plus 是一种静态类型的 编译式的 通用的 大小写敏感的 不规则的编程语言 支持过程化编程 面向对象编程和泛型编程 C 被认为是一种中级语言 它综合了高级语言和低级语言的特点 C 是由 Bjarne Stroustrup
  • 模仿苹果手机虚拟键的代码分享,有兴趣的可以玩玩。 下面的是链接,复制粘贴到浏览器就能下载...

    http files cnblogs com files godlovexq 模仿苹果虚拟home键的效果有解释的 zip 转载于 https www cnblogs com godlovexq p 5252782 html
  • C语言函数大全-- i 开头的函数

    i 开头的函数 1 imagesize 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 initgraph 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 inport 3 1 函数说明 3 2 演示示例 4 insli
  • 再探ROP(上)

    0x00 前言 毕设和论文要搞吐了 再加上实习工作上的事情 近期又要开始准备HW的事情 只能先更新一部分 0x01 从x86到x64 之前的rop都是32bit的程序 由于这篇文章涉及的方法用于64bit的程序 这里先说一下两者的区别 做一
  • 数值分析(10)-数值微分

    整理一下数值分析的笔记 目录 1 误差 2 多项式插值与样条插值 3 函数逼近 4 数值积分与数值微分 THIS 5 线性方程组的直接解法 6 线性方程组的迭代解法 7 非线性方程求根 8 特征值和特征向量的计算 9 常微分方程初值问题的数
  • Docker - 超轻量中文ocr开源项目 chineseocr_lite 搭建

    Docker 超轻量中文ocr开源项目 chineseocr lite 搭建 一 OCR Docker 部署 二 Flask RESTful API demo chineseocr lite 源码地址 https github com ou
  • Qt/C++使用QUiLoader动态加载ui资源文件

    目录 动态对话框 使用场景 注意事项 动态对话框加载 获取动态对话框的控件对象 与动态对话框建立关联 动态修改ui资源文件效果测试 动态对话框 动态对话框 dynamic dialog 就是在程序运行时使用的从Qt设计师的 ui文件创建而来