Qt 对象树
一、什么是对象树
Qt中的对象树就是Qt中对象间的父子关系,每一个对象都有它所有子对象的指针,都有一个指向其父对象的指针。当创建对象在堆区时,如果指定的父亲是QObject派生下来的类或者是QObject的子类派生下来的类,当父对象被析构时子对象也会被析构。
二、示例
1.创建一个MyPushButton对象,继承QPushButton
2.在mypushbutton.cpp中对MyPushButton对象的构造和析构函数添加消息
#include "mypushbutton.h" #include<QDebug> MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent) { qDebug()<<"MyPushButton构造调用"; } MyPushButton::~MyPushButton() { qDebug()<<"MyPushButton析构"; }
3.在主窗口创建MyPushButton按钮的实例
#include "mainwindow.h" #include<QPushButton> #include"mypushbutton.h" #include<QtDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { MyPushButton *mybtn=new MyPushButton; mybtn->resize(120,50); mybtn->setText("MyPushButton"); mybtn->move(200,0); mybtn->setParent(this); } MainWindow::~MainWindow() { }
4.在mainwindow.cpp中的MainWindow的析构函数里添加消息
MainWindow::~MainWindow() { qDebug()<<"mainwindow析构"; }
5.关闭主窗口,查看各对象析构的顺序
MyPushButton构造调用
mainwindow析构 //此时只是走到析构函数里打印了mainwindow析构,mainwindow还没有被析构掉
MyPushButton析构
6.正确的顺序应该是:关闭主窗口时,主窗口的析构函数被调用,然后主窗口会看自己有没有子对象,有的话先把他们析构了,最后再把自己析构。