我知道在Qt中有很多关于内存管理的问题。我也读了这些问题:
但就我而言,我再次感到困惑!
我有一个名为QTableWidget
的{{1}}。我通过myTable
添加运行时小部件:
setCellWidget
然后,我删除了以下所有项目:
void MyClass::build()
{
for (int i=LOW; i<HIGH; i++)
{
QWidget *widget = new QWidget(myTable);
//
// ...
//
myTable->setCellWidget(i, 0, widget);
}
}
这些方法在很长一段时间内都会多次调用。而void MyClass::destroy()
{
for (int i = myTable->rowCount(); i >= 0; --i)
myTable->removeRow(i);
}
作为这些小部件的父级将沿着程序的生命周期生活。
剂量方法myTable
完全自动释放内存?或者我必须自己destroy()
分配小部件,如下所示?
delete
答案 0 :(得分:5)
一般来说,如果对如何使用课程有疑问或疑惑,请查阅本应附带的文档。幸运的是,QTableWidget::setCellWidget()
does in fact come with documentation:
void QTableWidget :: setCellWidget(int row,int column,QWidget * widget)
设置要在窗格中显示的给定窗口小部件 给定行和列,将窗口小部件的所有权传递给 表格 [强调我的] 。如果单元格小部件A被单元格小部件B,单元格小部件替换 A将被删除。例如,在下面的代码片段中, QLineEdit对象将被删除。
setCellWidget(index, new QLineEdit); ... setCellWidget(index, new QTextEdit);
在调用myTable->setCellWidget()
之后,该表现在拥有您传递给它的小部件。这意味着myTable
负责删除您传递给setCellWidget()
的小部件。在删除行时,您无需执行delete w;
。您的第一个destroy()
功能就足够了。
答案 1 :(得分:2)
void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )
将给定小部件设置为在给定行和列的单元格中显示,将小部件的所有权传递给表。
如果单元格小部件A被单元格小部件B替换,则将删除单元格小部件A.例如,在下面的代码片段中,将删除QLineEdit对象。
也就是说,您不会手动清理,因为资源的释放会自动发生在Qt对象树中,widget
已成为其中的一部分。