这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。我们需要显试删除(就是用DELETE删除)的对象是那些使用NEW创建的并且没有父对象的对象(切记是new的才要delete,通过成员函数获得的对象,没有特殊说明的,千万不要随便delete.)。如果我们在删除一个对象的父对象之前删除它,QT会自动地从它的父对象的子对象列表中移除它的。
意思是说,重定义父对象。如何重定义呢?看parent参数。
当PaintWidget放到某个窗口上的时候,该PaintWidget的父对象就被重定义为该窗口。
但是,由于PaintWidget本身继承于QWidget,那么还需要对QWidget的父对象重定义。PaintWidget通过parent指针来告诉父类QWidget:“我的父对象是该窗口,请把你的父对象也置为那个窗口”。
就是这样。。。
请注意区分父类和父对象的区别。
一、Qt的半自动化的内存管理
(1)QObject及其派生类的对象,如果其parent非0,那么其parent析构时会析构该对象。
(2)QWidget及其派生类的对象,可以设置 Qt::WA_DeleteOnClose 标志位(当close时会析构该对象)。
(3)QAbstractAnimation派生类的对象,可以设置 QAbstractAnimation::DeleteWhenStopped。
(4)QRunnable::setAutoDelete()、MediaSource::setAutoDelete()。
(5)父子关系:父对象、子对象、父子关系。这是Qt中所特有的,与类的继承关系无关,传递参数是与parent有关(基类、派生类,或父类、子类,这是对于派生体系来说的,与parent无关)。
//参考 https://blog.csdn.net/qq_42100881/article/details/80447441
二、布局、tabwiget 、tablewidget 、tableView treeview treeWidget添加控件需要自己手动释放不
1、布局
mywidget* pp = new mywidget
ui->verticalLayout->addWidget(pp)//verticalLayout 为主窗口 ui中的布局
测试:关闭主窗口, mywidget 的析构函数会自动进入
2、tabwiget
mywidget* pTest = new mywidget//其中没有设置setAttribute(Qt::WA_DeleteOnClose)
ui->tabWidget->addTab(pTest, "test")
测试:关闭主窗口, mywidget 的析构函数会自动进入
3、tablewidget
ui->tableWidget->setRowCount(2)//设置行数为2
ui->tableWidget->setColumnCount(2)//设置列数为5
myQComboBox* combox = new myQComboBox//myQComboBox自己继承QComboBox的 没有指定父亲,
ui->tableWidget->setCellWidget(0,0,combox)
测试:关闭主窗口, myQComboBox 的析构函数会自动进入
4、tableView
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)