一、对象树
1.对象树的概念
当创建对象在堆区的时候,如果指定的父类是QObject的派生下来的类或QObject的类,可以不用管理释放操作,他们会将对象放入对象树中,就是QObject的children()列表中。一定程度上简化了内存回收机制。
2.演示代码
-
新建一个mybtn类,继承QPushButton
.h文件
#ifndef MYPUSHBUTTON_H #define MYPUSHBUTTON_H #include <QPushButton> class MyPushButton : public QPushButton { Q_OBJECT public: explicit MyPushButton(QWidget *parent = nullptr);\ ~MyPushButton(); signals: public slots: }; #endif // MYPUSHBUTTON_H
.cpp文件
#include "mypushbutton.h" #include <QDebug> MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent) { qDebug() << "我的按钮类的构造调用"; //会自动换行 } MyPushButton::~MyPushButton() { qDebug() << "我的按钮类的析构"; }
-
在窗口类中调用
#include "mywidget.h" #include <QPushButton> //按钮控件的头文件 #include "mypushbutton.h" #include <QDebug> myWidget::myWidget(QWidget *parent) : QWidget(parent) { //创建自己按钮类的对象 MyPushButton* mybtn = new MyPushButton; mybtn->setText("我自己的按钮"); mybtn->move(200,300); mybtn->setParent(this); //设置到对象树中 } myWidget::~myWidget() { //先打印的这行话,再去找有没有儿子,确认没有儿子后才释放自己 qDebug() << "父类调用了析构函数"; }
-
查看结果
小结:这里看到的是先打印的父类析构,后打印的子类析构。其实并不是这样的。原因在于析构函数是先执行内部的代码块,再去析构对象。myWidget类在析构自身时,会去查找自己是否有子类,没有就将自己析构。有则查看子类是否有子子类,重复以上过程。只有在子类都析构后,才会析构到自己。
二、坐标
左上角为(0,0),x以右为正,y以下为正。
关于点是怎么算的。大家可以百度下像素点。