0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

玩Qt,这三种使用ui文件的方式不得不知!

嵌入式小生 来源:嵌入式小生 2023-01-31 13:28 次阅读

一、导读

本质上,Qt Designer的ui文件是一个以XML格式书写的文件,文件中内容描述了一个界面的widget关系树。这个文件在以下两种情况中会使用到:

(1)在编译的时候,这意味着ui文件将被转换为可编译的C++代码,这个过程由uic完成。

(2)在应用程序运行的时候,ui文件将由QUiLoader类处理,该类用于解析XML文件并动态构造widget树。

本文描述第一种情况:在编译的时候使用ui文件。描述ui文件背后的机制,以及如何在应用程序中使用设计好的ui文件。

二、编译过程中对ui文件的处理

在实际项目开发中,使用Qt Designer创建用户界面组件(当然也完全可以使用代码描述),并使用Qt的集成构建工具qmake和uic在构建应用程序时生成中间代码,这个过程是由集成开发环境完成的。生成的代码包含了ui文件中描述的用户界面对象,它是一个C++结构体,包含以下内容:

(1)指向窗体小部件、布局、布局项、按钮组和操作的指针。

(2)名为setupUi()的成员函数,用于在父部件上构建部件树。

(3)名为retranslateUi()的成员函数,用于处理ui文件字符串属性的转换。

生成的代码可以在应用程序中包含,并可以直接使用。除此之外,还可以用于扩展标准小部件的子类。

了解了QtCreator对ui文件背后的处理机制,下文将来看看如何在编译构建过程中使用ui文件。

三、在编译过程中如何使用ui文件

主要有三种方法在编译过程中使用ui文件:1、直接附加、2、单继承方式、3、多继承方式。

1、直接附加:构造一个小部件作为组件的占位符,并在其中设置用户界面。

2、单继承方式:子类化Qt标准界面元素的基类(例如QWidget或QDialog),并包含ui用户界面对象的私有实例。

3、多继承方式:将ui文件的基类和ui文件的用户接口对象都子类化。因此这可以在从子类的范围内直接使用ui文件中定义的小部件。

(3-1)直接附加方式

本文中,笔者创建一个名为widget.ui的ui文件:

7580f59e-a121-11ed-bfe3-dac502259ad0.png


为了使用直接附加的方法使用ui文件,直接在main.cpp中包含ui_widget.h文件:

#include"ui_widget.h"

然后在主函数中构造一个标准的QWidget,用于创建widget小部件,接着我们则使用这个QWidget来托管由widget描述的用户界面ui文件,完整代码如下:

#include"ui_widget.h"

intmain(intargc,char*argv[])
{
QApplicationapp(argc,argv);

QWidget*w=newQWidget;
Ui::Widgetui;
ui.setupUi(w);

w->show();

returnapp.exec();
}

直接附加方法是一种在应用程序中快速使用组件的简单方法。但是在实际开发中,使用Qt Designer创建的组件通常需要与应用程序的其余代码进行紧密的集成。例如,上面提供的widget代码将编译并运行,但是界面中的对象之间不会进行交互。为了实现界面中对象之间的交互,则需要使用单继承方式。

(3-2)单继承方式

使用单继承方式,需要子类化一个标准的Qt小部件,并在其中包括ui用户界面对象的私有实例。可以采取以下两种方式的任意一种:

(1)成员变量方式

(2)指向成员变量的指针

成员变量方式

在这种方法中,子类化一个Qt小部件,并在构造函数中setupUi()用户界面。以这种方式使用的组件会将ui文件中使用的小部件和布局公开给Qt小部件子类,并提供一个标准系统,用于在用户界面和应用程序中的其他对象之间建立信号和槽函数连接。

为了确保可以正常使用用户界面,需要在子类化的Qt小部件描述文件中包含uic生成的头文件,然后引用Ui::Widget(本文是Widget.ui界面文件):

7591f6dc-a121-11ed-bfe3-dac502259ad0.png


子类化一个Qt小部件子类的构造函数通过调用ui对象的setupUi()函数来构造和配置界面中的所有小部件和布局:

75a13304-a121-11ed-bfe3-dac502259ad0.png


这种方法的优点是:简单使用继承来提供基于QWidget的接口,并将用户界面小部件变量封装在ui数据成员中。我们可以使用这个方式在同一个小部件中定义多个用户界面,每个界面都包含在自己的名称空间中,并可以覆盖(或组合)它们。

指向成员变量的指针

采用这种方式,在ui用户界面对象的写法上就变成了指向Ui::Widget的指针,且在名称空间中对界面对象进行了提前声明:

75c1abde-a121-11ed-bfe3-dac502259ad0.png


对应的源文件则是:

75cf59aa-a121-11ed-bfe3-dac502259ad0.png


这种方法的优点是:用户界面对象可以预先声明,这意味着不必在头文件中包含生成的ui_Widget.h文件,然后可以在不重新编译相关源文件的情况下更改ui文件。

可见,这两种方法都能使用ui文件,但推荐使用指向成员变量的指针的方式使用ui文件,这也是库和大型应用程序开发的方法,况且使用QtCreator新文件创建向导添加的ui界面类则是以这种方式生成的代码。

(3-3)多继承方式

使用Qt Designer创建的ui文件可以与标准的基于QWidget的类一起子类化。通过这种方式,则可以在子类的范围内直接访问ui文件中定义的所有用户界面组件,并能够使用connect()函数建立界面对象之间的信号和槽函数连接。

本文创建了Widget.ui界面描述文件,首先则需要在子类中包含使用uic生成的头文件:

#include"ui_widget.h"

接着在这个类的定义中需继承QWidget和Ui::Widget,可以私有的继承Ui::Widget,以确保用户界面对象在子类中是私有的。当然还可以使用public或protected关键字,就像在前面的例子中可以设置ui为public或protected一样。如下所示:

75db84dc-a121-11ed-bfe3-dac502259ad0.png


对应的源码文件则是:

75ea0746-a121-11ed-bfe3-dac502259ad0.png


在多继承方式中,用户界面中使用的小部件的访问方式与手工在代码中创建的小部件的一样。除此之外,我们不再需要ui前缀来访问这些小部件了。

四、总结

以上三种在应用程序编译时使用ui文件的方法,其目的都是以如何在应用程序设计和编写中使用UI文件为目的展开的。直接附加方法较为简单,在开发中几乎不使用。单继承方式较为常用,其次是多继承方式。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • XML
    XML
    +关注

    关注

    0

    文章

    188

    浏览量

    33153
  • 文件
    +关注

    关注

    1

    文章

    571

    浏览量

    24848
  • 函数
    +关注

    关注

    3

    文章

    4350

    浏览量

    63051
  • C++
    C++
    +关注

    关注

    22

    文章

    2114

    浏览量

    73932
  • Qt
    Qt
    +关注

    关注

    1

    文章

    309

    浏览量

    38116

原文标题:玩Qt,这三种使用ui文件的方式不得不知!

文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    伺服电机的三种控制方式

    伺服电机控制方式有脉冲、模拟量和通讯这三种,在不同的应用场景下,我们该如何选择伺服电机的控制方式呢?
    发表于 08-17 11:01 7190次阅读

    debugInRam,与debuginflash,reinflash这三种烧写方式有什么区别?

    我买的是一个lpc2131的arm板子然后总是出现以下情况,我用的是jlink,这样之后就没法烧代码了,然后只有用j-tag烧写之后才能重新编码?我用的烧写方式是debugInRam,另外与debuginflash,reinflash这三种
    发表于 02-20 18:34

    模电设计不得不看——模拟电路设计原则

    模电设计不得不看——模拟电路设计原则
    发表于 08-17 21:26

    不得不看的蓝牙4.0组网实验教程

    不得不看的蓝牙4.0组网实验教程
    发表于 02-26 16:33

    stm32的三种编程下载方式

    J-link几乎可以调试所有的arm芯片,不得不说是个好东东。这里记录三种stm32的下载程序方式:1.J-Flash下载(需要用到J-link)2.MDK配置下载(需要用到J-link)3.ISP
    发表于 06-24 20:50

    请问stm32启动的三种方式是什么意思?

    请群主详细解释下这三种启动方式,看了参考资料不是很明白其意!谢谢!
    发表于 07-17 04:35

    伺服电机的三种控制方式怎么选

    一般伺服都有三种控制方式:速度控制方式,转矩控制方式,位置控制方式。大多数人想知道的就是这三种
    发表于 01-29 07:28

    在main函数运行之前,你不得不知的那些事

    在main函数运行之前,不得不知的那些事在c_int00函数中完成的功能有哪些?
    发表于 04-20 06:03

    设计PCB不得不关注的重点

    设计PCB不得不关注的重点
    发表于 04-21 06:24

    STM32支持三种启动方式

    正文不得不提的启动方式STM32支持三种启动方式 1. FLASH启动 2. SRAM启动 3. 系统存储器启动这三种启动顺序决定了上电后第
    发表于 08-23 06:03

    如何使用三种方式进行文件的创建

    ,使用文本编辑器进行创建,使用重定向符号进行创建,接下来就演示如何使用这三种方式进行文件的创建。使用touch命令进行文件创建touch命令最初的作用是对
    发表于 12-15 08:42

    伺服电机的三种控制方式该如何应用

    一般伺服都有三种控制方式:速度控制方式,转矩控制方式,位置控制方式。大多数人想知道的就是这三种
    的头像 发表于 12-14 23:12 5511次阅读

    如何应用伺服电机的三种控制方式

    一般伺服都有三种控制方式:速度控制方式,转矩控制方式,位置控制方式。大多数人想知道的就是这三种
    发表于 01-22 06:30 7次下载
    如何应用伺服电机的<b class='flag-5'>三种</b>控制<b class='flag-5'>方式</b>

    不得不收藏的PCB的Checklist!

    不得不收藏的PCB的Checklist
    发表于 02-09 10:46 37次下载
    <b class='flag-5'>不得不</b>收藏的PCB的Checklist!

    8051单片机的这三种数据传输方式,你了解多少?

    单片机CPU与外部设备交换信息通常有如下几种方式:无条件传送方式,查询传送方式和中断传送方式。我们以单片机与微型打印机接口为例讲述这三种
    发表于 02-10 11:00 1次下载
    8051单片机的<b class='flag-5'>这三种</b>数据传输<b class='flag-5'>方式</b>,你了解多少?