繁体   English   中英

Qt内存管理容器

[英]Qt memory management for containers

我知道在Qt中有很多关于内存管理的问题。 我也读了这些问题:

但就我而言,我再次感到困惑!

我有一个名为myTableQTableWidget 我通过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分配的小部件,如下所示?

void MyClass::destroy2() // This maybe causes to crash !!
{
    for (int i = myTable->rowCount(); i >= 0; --i)
    {
        QWidget *w = myTable->cellWidget(i, 0);
        delete w;
        myTable->removeRow(i);
    }
}

一般来说,如果对如何使用课程有疑问或困惑,请查阅本应附带的文档。 幸运的是, QTableWidget::setCellWidget()实际上带有文档

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()函数就足够了。

文档

 void QTableWidget::setCellWidget ( int row, int column, QWidget * widget ) 

设置要在给定行和列的单元格中显示的给定窗口小部件,将窗口小部件的所有权传递给表。

如果单元格小部件A被单元格小部件B替换,则将删除单元格小部件A. 例如,在下面的代码片段中,将删除QLineEdit对象。

也就是说,您不会手动清理,因为资源的释放会自动发生在Qt对象树中,您的widget已成为其中的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM