错误范例
class MyWidget : QWidget{
QPushButton btn;
QTableWidget table;
MyWidget(){
table.setParent(this);
btn.setParent(this/table);
table.setCellWidget(0, 0, &btn);
}
}
这个代码会报错!! 其实,btn.setParent
完全可以不写!!
因为,table.setCellWidget
会获取btn
的所有权ownership。
即,不管给不给btn指定parent,btn的parent 一定是table。
而当我们delete掉这个MyWidget对象时,由于table是在btn的下面定义。
this(MyWidget)会先delete掉table(此时,table会先delete到所有孩子btn,然后delete自己),然后this再delete掉btn。
所以,当this去delete掉btn时,就报错了。
解决方法: 先定义table,再定义btn
version————
qt的delete/deleteLater机制
' 简称: QObject类, 表示 所有以QObject为祖先的类 '
QT中所有的'QObject类',都有一个 “设置父类”的概念
这个“设置父类”,不是C++里类的继承的概念 跟C++没有关系!!
而是QT自己的一套机制,也称为 'QT的对象树'
首先,思考对象树的产生原因 即他可以解决怎样的问题
比如,你有一个window 他里面有很多很多个pushbutton、label、、、
其实这个window 和 他里面的这些小控件,是融为一体的!!
假如说,这个window都没了 那么这些小控件肯定没有存在的意义
如果是C++,则你需要 '一个一个的delete',这肯定非常累人
此时就引入了'QT的对象树'机制
即,当你要把你的window给delete掉时,他里面的小控件 会'自动的'delete掉
你不需管理这么多个小控件。
对象树机制,有两种实现方式:
1, 所有以Q开头命名的类,他都继承自QObject(这里的继承,是C++意义上的)
而QObject有个函数: void QObject::setParent(QObject