03 QT的窗口系统-QWidget

版权声明:原创不易,如引用,请附原文链接 https://blog.csdn.net/Chiang2018/article/details/88931869

所有窗口及窗口控件都是从QWidget直接或间接派生出来的。当你创建一个QObject对象时,可以通过构造函数的参数指定其父对象,此时父对象会把这个QObject对象会自动添加到其children()列表中。当父对象析构的时候,这个列表中的所有(子)对象也会被析构。当我们删除某个子对象时,父对象会自动将其从父对象列表中删除。而当我们删除某个父对象时,也会自动将其children()列表中所有子对象一个一个删除。Qt 保证没有QObject会被 delete 两次。

 

 

如果QObject对象在栈上被创建,Qt 保持同样的行为,来看下下面的代码片段:

{
    QWidget w;
    QPushButton b("Quit", &w);
}

作为父组件的 w和作为子组件的 b都是QObject的子类,因标准 C++要求,局部对象的析构顺序应该按照其创建
顺序的相反过程,所以此时会先调用b的析构函数,将其从父对象w的children()列表中删除,之后再调用w的析构函数,因为此时b已经不再w的children()列表中,所以不会再次析构b。

但是,如果我们使用下面的代码,情况又有所不同:

{
    QPushButton b("Quit");
    QWidget w;
    b.setParent(&w);
}

从上面代码可以看出,因标准 C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程,所以此时会先析构w及其children()列表中的子对象,所以此时b也被析构。然后,代码继续执行,因为 b也是一个局部变量,在超出作用域的时候当然也需要析构,但是,这时候已经是第二次调用 quit 的析构函数了,C++ 不允许调用两次析构函数,因此,程序崩溃了。

猜你喜欢

转载自blog.csdn.net/Chiang2018/article/details/88931869
03