不二如是 发表于 2016-10-22 14:29:24

108-对象树与拥有权(Object Tree &Ownership) -【扫盲】

本帖最后由 不二如是 于 2016-10-22 16:20 编辑




Qt中使用对象树(object tree)来组织和管理所有的QObject类及其子类的对象。

当创建一个QObject时,如果使用了其他的对象作为其父对象(parent)。

那么这个QObject就会被添加到父对象的children()列表中,这样的父对象被销毁时,这个QObject也会被销毁。

实践表明,这个机制非常适合管理GUI对象。

例如,一个QShortcut(键盘快捷键)对象使相应窗口的一个字对象,所以当用户关闭了这个窗口时,这个快捷键也可以被销毁。

QWidget作为能够在屏幕上显示的所有部件的基类(是不是超厉害~),拓展了对象间的父子关系(你有没有想过,为啥没有母子关系?)
一个子对象一般也就是一个子部件,因为他们要显示在父部件的区域之中。

例如,当你关闭一个消息对话框(message box)后要销毁它,消息对话框中的按钮和标签也会被销毁。

因为按钮和标签都是message box的子部件吗。

树根都死了,果子又怎么存下呢!

当然了,也可以自己来销毁一个子对象。

接下来我们要搞事情!!!

只new,不delete!

有两种剧情,我提前撩开让你看下~{:10_336:}


[*]对于规范的Qt程序,我们要在main()函数中将主窗口部件创建在栈上

例如

Widget w;

而不要在堆上进行创建(使用new操作符)。

对于其他窗口部件,可以使用new操作符在堆上进行创建,不过一定要指定其父部件,这样就不用delete操作来销毁对象。

没错点我,你会被传送过去~



[*]重定义父部件(reparented)

例如,将一个包含其它部件的布局管理器应用到窗口上。

那么在该布局管理器和其中的所有部件都会自动将他们的父部件转换为该窗口部件

你又没猜错,点我你会被传到另一个地方

页: [1]
查看完整版本: 108-对象树与拥有权(Object Tree &Ownership) -【扫盲】