【Qt】—— 对象模型的认识

这篇具有很好参考价值的文章主要介绍了【Qt】—— 对象模型的认识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

(一)Parent对象指针

(二)对象树的引入

(三)代码示例


(一)Parent对象指针

在Qt中创建很多对象的时候会提供⼀个Parent对象指针,接下来解释这个parent到底是⼲什么的。

首先QObject是以对象树的形式组织起来的。

  • 当创建⼀个QObject对象时,会看到QObject的构造函数接收⼀个QObject指针作为参数,这个参数就是parent,也就是⽗对象指针。
  • ◦ 这其实就相当于,在创建QObject对象时,可以提供⼀个其⽗对象,我们创建的这个QObject对象会⾃动添加到其⽗对象的children()列表。
  • ◦ 当⽗对象析构的时候,这个列表中的所有对象也会被析构。(需要注意的是这里的父对象并不是继承意义上的父类!)

对于上述这种机制在GUI程序设计中相当有⽤。例如,⼀个按钮有⼀个QShortcut(快捷键)对象作为其⼦对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的。


QWidget是能够在屏幕上显⽰⼀切组件的⽗类。

  • QWidget继承⾃QObject,因此也继承了这种对象树关系。⼀个孩⼦⾃动地成为⽗组件的⼀个⼦组件。因此,它会显⽰在⽗组件的坐标系统中,被⽗组件的边界剪裁。例如:当⽤⼾关闭⼀个对话框的时候,应⽤程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该⼀起被删除。事实就是如此,因为这些都是对话框的⼦组件。
  • 当然,我们也可以⾃⼰删除⼦对象,此时会⾃动从其⽗对象列表中删除。例如:当我们删除了⼀个⼯具栏时,其所在的主窗⼝会⾃动将该⼯具栏从其⼦对象列表中删除,并且⾃动调整屏幕显⽰。

(二)对象树的引入

Qt引⼊对象树的概念,在⼀定程度上解决了内存问题。

  • 当⼀个QObject对象在堆上创建的时候,Qt会同时为其创建⼀个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
  • 任何对象树中的QObject对象delete的时候,如果这个对象有parent,则⾃动将其从parent的children()列表中删除;如果有孩⼦,则⾃动delete每⼀个孩⼦。Qt保证没有QObject会delete两次,这是由析构顺序决定的。

如果QObject在栈上创建,Qt保持同样的⾏为。正常情况下,这也不会发⽣什么问题。来看下⾯的代码⽚段:

【Qt】—— 对象模型的认识,QT,qt,开发语言

作为⽗组件的window和作为⼦组件的quit都是QObject的⼦类(事实上,它们都是QWidget的⼦类,⽽QWidget是QObject的⼦类)。这段代码是正确的,quit的析构函数不会被调⽤两次,因为标准C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作⽤域时,会先调⽤quit的析构函数,将其从⽗对象window的⼦对象列表中删除,然后才会再调⽤window的析构函数。


但是,如果我们使⽤下⾯的代码:

【Qt】—— 对象模型的认识,QT,qt,开发语言

 情况⼜有所不同,析构顺序就有了问题。我们看到,在上⾯的代码中,作为⽗对象的window会⾸先被析构,因为它是最后⼀个创建的对象。在析构过程中,它会调⽤⼦对象列表中每⼀个对象的析构函数,也就是说,quit此时就被析构了。然后,代码继续执⾏,在window析构之后,quit也会被析构,因为quit也是⼀个局部变量,在超出作⽤域的时候当然也需要析构。但是,这时候已经是第⼆次调⽤quit的析构函数了,C++不允许调⽤两次析构函数,因此,程序崩溃了。
由此我们看到,Qt的对象树机制虽然在⼀定程度上解决了内存问题,但是也引⼊了⼀些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰⼀下,所以,我们最好从开始就养成良好习惯

在Qt中,尽量在构造的时候就指定parent对象,并且⼤胆在堆上创建。

Qt对象树如图:

【Qt】—— 对象模型的认识,QT,qt,开发语言


(三)代码示例

1、首先创建⼀个新⼯程并编译运⾏,⽣成如下窗⼝:

【Qt】—— 对象模型的认识,QT,qt,开发语言

2、选中⼯程名,⿏标右键------->"add new..."(或"添加新⽂件")。

【Qt】—— 对象模型的认识,QT,qt,开发语言

【Qt】—— 对象模型的认识,QT,qt,开发语言

【Qt】—— 对象模型的认识,QT,qt,开发语言

3、紧接着选择"choose..."之后,弹出如下界⾯;

【Qt】—— 对象模型的认识,QT,qt,开发语言

4、在点击"下⼀步",弹出如下对话框;
 

【Qt】—— 对象模型的认识,QT,qt,开发语言

5、点击"完成"之后,⼿动创建类的头⽂件以及源⽂件会⾃动添加到⽬标⼯程中; 

【Qt】—— 对象模型的认识,QT,qt,开发语言

6、修改头⽂件;

【Qt】—— 对象模型的认识,QT,qt,开发语言

7、紧接着编写源⽂件;

【Qt】—— 对象模型的认识,QT,qt,开发语言

8、编译并运⾏;

【Qt】—— 对象模型的认识,QT,qt,开发语言

9、当关闭弹出的对话框时,就会⾃动调⽤按钮的析构函数;

【Qt】—— 对象模型的认识,QT,qt,开发语言

10、观察析构函数的执⾏顺序;

【Qt】—— 对象模型的认识,QT,qt,开发语言

  1. 对象树确保的是先释放⼦节点的内存,后释放⽗节点的内存.
  2. ⽽析构函数的调⽤顺序则不⼀定遵守上述要求.因此看到⼦节点的析构执行顺序反⽽在⽗节点析构顺序之后.

注意:调⽤析构函数和释放内存并⾮是同⼀件事情.

总的来说,Qt 中的对象树提供了一种方便的机制来管理应用程序中的对象,使得对象的创建、查找和销毁都变得简单和高效。 文章来源地址https://www.toymoban.com/news/detail-838986.html

到了这里,关于【Qt】—— 对象模型的认识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT的工程文件认识

    目录 1、QT介绍 2、QT的特点 3、QT模块 3.1基本模块 3.2扩展模块 4、QT工程创建 1.选择应用的窗体格式 2.设置工程的名称与路径 3.设置类名 4.选择编译器 5、QT 工程解析 xxx.pro 工程配置 xxx.h 头文件 main.cpp 主函数 xxx.cpp 文件 6、纯手工创建一个QT 工程 1.创建一个纯C++ 工程 2.在xxx.p

    2024年02月12日
    浏览(37)
  • 【VisualStudio】使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月10日
    浏览(63)
  • 界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 (Q技术交流:166830288) 树项

    2024年02月06日
    浏览(44)
  • 【VisualStudio】基于 Visual Studio 使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月15日
    浏览(50)
  • 【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 我要使用的功能比较简单,主要包含扫描串口、打开串口、发送数据、接收数据、暂停按钮、停止按钮,因此接下里将围绕这几个功能依次更新。 我的工程项目名字叫 “GUI”。

    2024年02月11日
    浏览(57)
  • 【Visual Studio】报错 C2653,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面。 使用 C++ 语言,配合 Qt 开发串口通信界面,在添加 Widget 做

    2024年02月11日
    浏览(40)
  • Qt6入门教程 6:Qt元对象系统

    目录 一.什么是Qt元对象系统? 二.编译时Qt Creator偷摸做了哪些事情? 1.uic 2.rcc 3.moc Qt中的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。元对象系统是基于以下3个条件的: ●该类必须继承自QObject类; ●必须在类的私有声

    2024年01月18日
    浏览(44)
  • 03 QT对象树

    Tips: QT通过对象树机制,能够自动、有效的组织和管理继承自QObject的Qt对象,不需要用户手动回收资源,系统自动调用析构函数。   验证对象树功能 : 新建C++文件  继承自QPushButton,但没有QPushButton,但有其父类QWidget,则选择Qwidget  修改继承和声明析构函数   关闭窗口时先

    2024年02月16日
    浏览(26)
  • Qt之元对象metaObject

    什么是元对象昂?在qt中元对象就是可以描述其它对象结构的对象,例如获取其它对象类的名称,一个对象下有多少成员函数,有哪些属性等。元对象的类QMetaObject。要使用元对象必须要满足以下几个条件: 必须要是QObject的子类 类的声明中必须包含Q_OBJECT宏 元对象编译器(

    2024年02月09日
    浏览(25)
  • QT6之类实例化——对象指针和对象

    Qt完全遵循C++ 中类的实例化动作按存储位置可以分为 栈中分配内存 和 堆中分配内存 两种,分别对应不用 new 实例化类和用 new 实例化类。 一、实例化两种方式 1、栈中分配; 如下图是qt非常常见的操作,将m_view声明为对象,它完全表明该对象的生命周期与MyWidget的生命周期相

    2023年04月25日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包