QT从入门到实战x篇_04_对象树及坐标系

承接上文:QT从入门到实战x篇_xx_创建及设置pushbutton控件:代码实现UI界面编写、控件设置。 问题:在system编码下汉字显示为乱码

本篇主要介绍Qt中的对象树和坐标系相关知识。
上文中利用new在堆上创建了多个pushbutton,但是一直没有做内存释放,这是为什么呢?这里就是因为对象树的存在。

对象树和元对象系统请同时参考:03-1_Qt 5.9 C++开发指南_番外1_QWidget项目默认代码解析(Qt对象模型:对象树与元对象系统;初始化列表用于调用父类有参构造和初始化)

1. 什么是对象树,它有什么作用呢?
简单一些总结: 当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,对象会放入到对象树中。一定程度上简化了内存释放的过程。

在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)

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

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

如果QObject在栈上创建,Qt 保持同样的行为。正常情况下,这也不会发生什么问题。

对象树模型:
在这里插入图片描述
2. 对象树上的对象构造和析构顺序
从上对象树中可以看到,构造是从上往下的,析构是从下往上的。

下面利用代码进行析构顺序的演示
(1)添加自定义类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)对继承的父类进行修改,得到如下:

mypushbutton.h

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H

#include <QPushButton>

class MyPushButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyPushButton(QWidget *parent = nullptr);

signals:

};

#endif // MYPUSHBUTTON_H

mypushbutton.cpp

#include "mypushbutton.h"

MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{

}

在这里插入图片描述
创建构造和析构函数

MyPushButton中的构造析构分别添加qDebug命令

MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{
qDebug()<<"111";
}
MyPushButton::~MyPushButton()
{
qDebug()<<"222";
}

Widget中添加如下:

Widget::~Widget()
{
qDebug()<<"333";
}

运行之后可以看到:

111 //MyPushButton构造
333 //Widget析构
222 //MyPushButton析构

按照之前的理论,好像不是按照从下往上进行析构的,这是为什么呢?
这里给出答案,这是因为析构时,先走到Widget的析构函数,先将析构函数内的命令执行,然后才会看Widget是否有子类,如果有子类就执行子类的析构函数。
3. 坐标系
以左上角为原点(0,0),X向右增加,Y向下增加。
在这里插入图片描述
对于嵌套窗口,其坐标是相对于父窗口来说的。
4.学习视频地址:
对象树
坐标系

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qt入门实战教程完整版是一本非常适合初学者的Qt教程。本书系统地介绍Qt的基础知识、编程方法、开发工具和实战项目。首先介绍了Qt的基础知识,如Qt的概念、Qt的架构、Qt的基本类库、Qt的信号与槽、QWidget的使用等。其次介绍了Qt的编程方法,如Qt的视图与模型、Qt的多线程程序设计、Qt的动画效果、Qt的XML解析等。然后介绍了Qt的开发工具,如Qt Designer的使用、Qt Creator的使用、Qt编译和调试方法等。最后通过几个实战项目,介绍Qt在实际开发中的应用。例如,实现一个简单的聊天室、实现一个简单的图片浏览器、实现一个简单的音乐播放器等。本书还详细介绍了Qt在不同平台上的使用,如Windows、Linux、Mac OS X等,通过多个代码示例和项目实践,帮助读者更好地理解Qt的编程思想和实现方法。总之,Qt入门实战教程完整版是一本入门级的Qt教程,涵盖了Qt的基础知识、编程方法、开发工具和实战项目,适合初学者学习和实践。 ### 回答2: Qt是一个功能强大的跨平台应用程序框架,开发者可以在Windows、MacOS、Linux和Android等多个操作系统上使用它来开发图形界面应用。Qt入门实战教程是一本非常实用的教材,全面介绍了Qt的基础知识和高级技术。 这本教程从Qt的概念、安装、编译等基础知识开始,逐步深入介绍了Qt的核心特性,包括Qt对象模型、信号与槽机制、界面设计、文件I/O和网络编程等。同时,它还涵盖了许多实现复杂功能的高级Qt编程技巧,如多线程编程、数据可视化、数据库操作和OpenGL渲染等。 在教程的实战部分,作者提供了许多有趣的项目,例如图片浏览器、音乐播放器和即时通讯软件等。通过实际操作这些项目,读者不仅可以加深对Qt的理解,还能够锻炼自己的编程水平, 总的来说,Qt入门实战教程是一本值得推荐的书籍。它既适合初学者快速入门,又适合有一定经验的开发者深入学习Qt。无论是想要开发桌面应用或移动应用,都可以从这本教材中受益。 ### 回答3: Qt是一个跨平台的GUI应用程序开发框架,被广泛应用于桌面应用程序、嵌入式设备、移动设备和Web应用程序等领域。为了帮助初学者快速掌握Qt的使用,出版社出版了一本名为“Qt入门实战”的教程,该教程共分为14章,内容涵盖了从Qt基础知识到实际开发的全过程。 在该教程的第一章,介绍了Qt的基本概念和架构,讲解了如何安装和使用Qt的集成开发环境QtCreator。接着在第二章中,讲解了Qt的UI设计,包括Qt Designer的使用和界面控件的基本使用方法。然后,在第三至六章中,详细介绍了Qt的信号槽机制、事件处理、多线程编程和文件IO等概念和操作,使读者能够更好地掌握应用程序的开发。 接下来,在第七至十章中,教程介绍了Qt网络编程、数据库编程、Web开发和OpenGL编程等高级主题,丰富了读者的实战经验。第十一至十三章是关于Qt与嵌入式开发的部分,讨论了如何将Qt应用于莓派、ARM架构、Android平台等嵌入式环境中的具体操作方法。最后,在第十四章中,作者总结了全书的重点和难点,并提供了实现一个完整的Qt项目的步骤和指导。 总之,“Qt入门实战”教程是一本非常完整的Qt入门指南,对初学者来说具有很高的教学价值。读者可以通过该教程系统地学习Qt的基本知识和应用,掌握Qt开发实践所需的技能,从而为其今后的开发工作打下良好的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值