c++实现Qt对象树机制

文章目录

  • 对象树是什么
  • 使用对象树的好处
  • 使用c++实现对象树

对象树是什么

 我们常常听到 QObject 会用对象树来组织管理自己,那什么是对象树?
 这个概念非常好理解。因为 QObject 类就有一个私有变量 QList,专门存储这个类的子孙后代们。比如创建一个 QObject 并指定父对象时,就会把自己加入到父对象的 childre() 列表中,也就是 QList 变量中。

使用对象树的好处

 好处就是:当父对象被析构时子对象也会被析构。
 举个例子,有一个窗口 Window,里面有 Label标签、TextEdit文本输入框、Button按钮这三个元素,并且都设置 Window 为它们的父对象。这时候我做了一个关闭窗口的操作,作为程序员的你是不是自然想到将所有和窗口相关的对象析构啊?古老的办法就是一个个手动 delete 呗。是不是很麻烦?Qt 运用对象树模式,当父对象被析构时,子对象自动就 delete 掉了,不用再写一大堆的代码了。
 所以,对象树在 GUI 编程中是非常非常有用的。

使用c++实现对象树

 我们知道Qt对象在创建的时候都可以指定一个父指针,Qt就是通过这个操作将子对象添加到父对象的容器中进行管理,当父对象析构的时候就会遍历这个容器对子对象进行析构,这样子的话用户就不需要自己进行析构子对象。


#include 
#include 
using namespace std;
class Object;
typedef list<Object *> ObjectList;

class Object
{
public:
    ObjectList children_list;
    Object(Object *parent = nullptr)
    {
        if(parent)
        {
            parent->children_list.push_back(this);
        }
    }
    virtual ~Object()
    {
        for(auto it = children_list.begin();it != children_list.end();it++)
        {
            delete *it;
        }
    }
};

class A:public Object
{
public:
    A(Object *parent):Object(parent)
    {
        cout<<"A的构造函数被执行了"<<endl;
    }
    ~A()
    {
        cout<<"A的析构函数被执行了"<<endl;
    }
};

class B:public Object
{
public:
    B(Object *parent):Object(parent)
    {
        cout<<"B的构造函数被执行了"<<endl;
    }
    ~B()
    {
        cout<<"B的析构函数被执行了"<<endl;
    }
};


int main()
{
    Object obj;
    A *a = new A(&obj);
    return 0;
}

c++实现Qt对象树机制_第1张图片
当obj对象析构后,a对象不需要进行delete就可以自动进行析构。

你可能感兴趣的:(qt,c++,c++,qt,开发语言)