关于parent指针以及对话框属性

程序写多了,就会在各个Qt函数里面都发现parent指针的身影,出于知识补全写个博客记录一下。

先从明显的角度上来说:

指定了parent指针(或者this指针)的对象的构造函数所构造出的窗口,是不作为顶层窗口出现的,而是作为父组件的子对话框(区别就是系统任务栏,没有parent指针的会出现两个顶层窗口,而指定了parent指针的,任务栏只会出现一个窗口)。

并且,如果作为子组件的话,出现的子组件窗口默认位于父窗口的中央位置 。

记住,null和0是两码事,不能说QWidget  *parent = 0没指定parent指针,相反,指定了指针,只不过暂时初始化为0(后面构造函数会操作)。

再从“对象树”的角度来说:

Qt有个对象树机制,具体这里不多说(从名字就可以看出来长啥样了)

添加了parent指针的对象会自动添加到其父对象的children()列表,当父对象析构的时候,children()列表里面所有的子对象也都会被析构,反过来,如果某个子对象被析构了,则从children()列表中删去这个子对象(对父对象本身没影响)。这样子就可以保证:当父窗口(对象)delete(shutdown)掉的时候,他的子组件(对象)也可以被正确地关闭,这样子就帮助了我们正确的管理了内存,防止了内存泄露。

 



另外再谈一下对话框属性:分为模态对话框非模态对话框,模态对话框又分成程序级的模态(QDialog.exec() ),窗口级的模态(QDialog::open())。非模态对话框(QDialog.show())。

程序级别的模态就是只能操作这个窗口,操作完了之后才能操作别的窗口。

窗口级别的模态仅仅阻塞和这个窗口相关联的几个窗口。

非模态的不阻塞,可以任意操作。

 

parent可以参照这个博客:https://blog.csdn.net/jh1513/article/details/52311372

对话框相关知识参照:https://www.devbean.net/2012/09/qt-study-road-2-dialogs-intro/

PS:new关键字创建的内存在堆上,不会被析构,而创建在栈上的会背析构。

 

posted @ 2019-05-13 21:11  jckcoenf  阅读(582)  评论(0编辑  收藏  举报