4.1 对象树概念
在qt中创建对象的时候会提供一个Parent对象指针,下面来解释这个Parent指针是干什么的:
(1)QObject是以对象树的形式组织起来的
(2)当创建一个对象QObject对象时,会看到QObject的构造函数接收一个QObject指针为参数,这个参数就是Parent,也就是父对象指针。这相当于,在创建QObject对象时,可以提供一个其父对象(指定父亲),我们创建的这个QObject对象会自动添加到其父对象的children()列表
(3)当父对象析构的时候,其父对象的children()列表中的所有对象也会被析构(注意这里的父对象并不是继承意义上的父类)。形象化的解释就是当释放窗口时,窗口内的组件对象也会被释放,这是合理的
(4)因此可以在代码中肆意创建对象,只要指定父对象,父对象包含管理释放(析构),那么子对象在父对象析构的时候会自动析构。
(5)对象树中,析构的顺序和构造的顺序是相反的
4.2 对象树构造及析构过程(释放对象)
4.3.1 前提准备
首先创建项目,创建项目的详细操作步骤参考博客:https://blog.csdn.net/qq_36926037/article/details/123720720
4.3.2 对象树的构建及析构过程
(1)自定义按钮类:在项目中创建新文件(包含cpp和h)
(2)修改头文件(.h)文件,让自定义按钮类继承QPushButton类(自定义的类为QPushButton类的子类),并且创建该类的构造函数和析构函数
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include <QWidget>
#include <QPushButton>
class MyPushButton : public QPushButton
//修改为继承自QPushButton类
{
Q_OBJECT
public:
explicit MyPushButton(QWidget *parent = nullptr);
// //构造函数
// MyPushButton();
//析构函数
~MyPushButton();
signals:
};
#endif // MYPUSHBUTTON_H
(3)修改自定义按钮类的源文件(.cpp),实现头文件中的构造函数和析构函数。
#include "mypushbutton.h"
//引入打印信息的头文件
#include <QDebug>
MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{
qDebug()<<"我的按钮类的构造"<<endl;
}
MyPushButton::~MyPushButton()
{
qDebug()<<"我的按钮类的析构"<<endl;
}
(4)在窗口源文件中,使用自定义的按钮类。构建对象数(对象树的父对象是窗口对象,子对象为依赖窗口对象的其他组件的对象)
#include "mywidget.h"
//(1)引入按钮头文件
#include "QPushButton"
//引入自定义的按钮
#include <mypushbutton.h>
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
//(2)创建第一个按钮:首先引入头文件
QPushButton *btn=new QPushButton;
//2.1 显示按钮
//2.1.1方法:使用show以顶层的方式弹出窗口或控件(新开辟窗口进行显示)
//btn->show();
//2.1.2 方法:让窗口或控件依赖在父窗口中(mywidget窗口)
btn->setParent(this);
//2.2显示按钮上文本
btn->setText("第一个按钮");
//(3)创建第二个按钮:
//这种方法创建,会按照控件的大小生成窗口,需要重置窗口大小
QPushButton *btn2=new QPushButton("第二个按钮",this);
//移动按钮
btn2->move(100,100);
//重置窗口大小
resize(600,400);
//设置窗口标题
setWindowTitle("第一个窗口");
//设置固定窗口大小
setFixedSize(600,400);
//设置按钮大小
btn->resize(50,50);
//(4)创建自定义按钮的对象
MyPushButton *btn3=new MyPushButton;
btn3->setText("自定义按钮");
btn3->move(100,200);
btn3->setParent(this);//设置到对象树中
}
myWidget::~myWidget()
{
}
(5)验证对象树中的对象析构的顺序(先析构子对象再析构父对象——先析构自定义的按钮对象,在析构该对象的父对象,即窗口类对象)
4.3 QT中的坐标系
以左上角为原点(0,0),X向右增加,Y向下增加
对于嵌套窗口,其坐标是相对于其父窗口来说的