QT +坐标系统 + 自定义控件 + 对象树的验证(自动进行析构)_内存回收机制

通过创建一个新的按钮类,来进行析构函数的验证,即对象树概念的验证。当程序结束的时候会自动的调用析构函数,

验证思路:

  要验证按钮会不会自动的析构,(即在QPushButton类里面的析构函数添加qDebug打印出一些东西就知道调用了),但是QPushButton的这个按钮类也不是自己写的(析构函数也就不知道在哪里),而是系统里就有的。所以这里为了实现验证,这里将会自己构建一个按钮类,并且自己写这个按钮类的析构函数,在析构函数里面添加打印的东西,这样当调用的时候就会显性的知道系统调用了析构函数。

 

新创建按钮类的时候,会发现并没有QPushButton这个基类,这个时候我们可以选择使用QWidget,在创建完成后,再重新写QPushButton,为了创建新的按钮,添加了两个文件,即mybutton.cpp和mybutton.h,

在mybutton.h的文件中需要改进的地方有两个,由于新建的按钮的基类实际上是QPushButton,所以这里我们将头文件由#include <QWidget>改为#include <QPushButton>,由class MyButton : publicQWidget     改为     class MyButton : public QPushButton(新按钮继承于QPushButton),

 

在mybutton.cpp文件中将

 

MyButton::MyButton(QWidget *parent) : QWidget(parent)

 

{
}

 

改为

MyButton::MyButton(QWidget *parent) : QPushButton(parent)

{
}


#include "mybutton.h"

#include <QDebug>
                                        //通过参数列表给基类构造函数传参
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{

}

MyButton::~MyButton()
{
    qDebug()<<"按钮被析构";
}
 
#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
#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(10,10);
    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()
{

}

 

在以上的代码中有坐标系统的知识点,坐标系统的知识相对来说较简单,这里不用赘述了。重点叙述和要掌握怎么验证对象树和创建新的按钮类,以及实现这种对象树的条件。

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院