关于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关键字创建的内存在堆上,不会被析构,而创建在栈上的会背析构。