关于在Qt中设置小部件的父级的问题



从这里的这篇文章,一般来说:

所有QObject都将自动删除自己的子对象。(请参见此处为文档。(Q桥是QObject。所以只要你建立父/子关系,您不需要手动删除对象。要做到这一点,只需将指向父对象的指针传递给构造函数:

QLabel *label1 = new QLabel;   // <<- NEED TO DELETE
QLabel *label2 = new QLabel(some_parent_obj);   // Will be deleted when some_parent_obj is deleted

因此出现了一些问题:

  1. 是否每个小部件都是必需的需要/必需的父级?如果没有,有哪些例外情况?如果是,没有父级的小部件会发生什么

我之所以这么问,是因为从Qt文档中的示例来看,一些示例小部件有父部件(QLabel示例(,但有些没有(QBarChart示例,还有QFontQColor等(

所以我想知道是否有一个例外,这些小部件不需要任何父级,如果出于某种原因我用new声明它们,那么之后我必须使用delete

反之亦然。。。

  1. 没有父级的小部件是否保证在其所在的小部件(不一定是其父级(被删除时会导致内存泄漏(或类似情况(?或者如果它从布局中删除而没有发生任何删除

因为根据我的代码经验,我可能已经创建了相当多(大约100(个小部件和其他东西,既没有设置任何父级(也没有在之后使用delete(,而且项目运行得很好,即使过了一段时间也没有任何停顿(虽然效果可能是潜在的,因为我还没有运行Memcheck(,所以这个问题就在这里。

每个必要的小部件都需要/需要一个父级吗?

如果您希望它们自动删除-是的。但是

如果没有,有哪些例外?如果是,没有父窗口小部件会发生什么?

如果使用QLayout::addWidget将小部件附加到布局,则无需为其提供父级。如果您查看源代码,您会发现当您这样做时,它会自动将布局的父级附加为小部件的父级(除非您没有将布局附加到任何小部件(。

但是,如果您让用new创建的小部件没有父级,并且不附加到任何东西,这就是内存泄漏。您必须使用deleteQObject::deleteLater删除它。当对象有任何连接时,建议使用最后一个选项。

没有父级的小部件是否保证在删除其所在的小部件(不一定是其父级(时会导致内存泄漏(或类似情况(?或者如果它从布局中删除而没有发生任何删除?

正如我已经提到的,QLayout::addWidget为添加的小部件设置了父级,所以答案是否定的。另外请注意,当您调用QLayout::removeWidget时,它只从布局中删除QLayoutItem,但小部件的父级在调用QLayout::addWidget后保持不变。

最新更新