在Qt中创建对象的时候我们会提供一个Parent指针,如:
QPushButton *btn2 = new QPushButton("这是一个按钮2",this);//这里将QPushButton对象的parent指针设置为本widget
这个Parent指针是什么?
- QObject
QObject是以对象树的形式组织起来的。
当创建一个QObject对象时,会看到QObject的构造函数接受一个QObject指针为参数,这个参数就是Parent指针,这相当于,在创建QPushButton时,可以提供一个其父对象,我们创建的这个QPushButtont对象会自动添加到其父对象(Qobject)的 children()列表 。当父对象析构的时候,这个列表中的所有对象也会被析构 (注意,这里的父对象并不是继承意义上的父类! )
使用的注意事项
因为栈区和堆区不同的声明对象的原因导致出现,wiget和其他子类组件析构顺序错误的情况。
/*该段代码无问题:因为栈一般先构造的后析构,
下面程序是先析构button,同时将button从window的子对象列表删除,
然后析构window,仅析构window (window无子对象)
*/
QWidget window;
QPushButton button = QPushButton(“退出”,&window);
/*该段代码有问题:因为栈一般先构造的后析构,导致重复析构,程序崩溃。
下边程序是先析构window,析构window及window子对象(quit),然后析构quit
*/
QPushButton quit("Quit");
QWidget window;
quit.setParent (&window);
解决:在QT中,尽量构造的时候指定parent对象, 并且大胆在堆上创建