QT使用了对象树,进行内存回收,只要指定了父对象的对象,QT都会自动回收内存!回收顺序是反向遍历树!
要满足自动回收
1)指定父对象后
2)直接或间接继承于QObject
验证代码:
自定义按钮
头文件
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QPushButton>
class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = 0);
~MyButton();
signals:
public slots:
};
#endif // MYBUTTON_H
实现文件
#include "mybutton.h"
#include <QDebug>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{
}
MyButton::~MyButton()
{
qDebug() << "按钮被析构";
}
普通窗口组件
头文件
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
};
#endif // MYWIDGET_H
实现文件
#include "mywidget.h"
#include <QPushButton>
#include "mybutton.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
/* 对于父窗口(主窗口),坐标系统相对于屏幕
* 原点:相对于屏幕左上角
* x: 往右递增
* y: 往下递增
*/
move(100, 100);
/* 子窗口,坐标系统相对于父窗口
* 原点:相对于窗口空白区域左上角(不包括边框)
* x: 往右递增
* y: 往下递增
*/
QPushButton *b1 = new QPushButton(this);
b1->move(100, 100);
b1->setText("^_^");
b1->resize(200, 100);
QPushButton *b2 = new QPushButton(b1);
b2->move(10, 10);
b2->setText("@_@");
MyButton *b3 = new MyButton(this);
b3->setText("123");
//1)指定父对象后 2)直接或间接继承于QObject
//子对象如果是动态分配空间的new,不需要手动释放delete
//系统会自动释放
}
MyWidget::~MyWidget()
{
}
框架文件
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}