QObject类的对象树机制、qt内存回收机制、deleteLater、 delete与ui关系

错误范例

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 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值