如何解决关于在 Qt 中设置小部件的父级的问题
从this post这里,一般来说:
所有 QObject 都会自动删除自己的子对象。 (看 docs 此处。)QWidget 是 QObject。所以只要你建立一个 父/子关系,您无需手动删除您的 对象。为此,只需将指向父对象的指针传递给 构造函数:
QLabel *label1 = new QLabel; // <<- NEED TO DELETE
QLabel *label2 = new QLabel(some_parent_obj); // Will be deleted when some_parent_obj is deleted
所以出现了一些问题:
- 是否每个小部件都必须需要/必需一个父级?如果不是,有哪些例外?如果是,没有父级的小部件会发生什么情况?
我之所以这么问是因为从 Qt Docs 中的示例来看,一些示例小部件有父级 (QLabel
example),但有些没有(QBarChart
example,还有 QFont
、QColor
,等等...)
所以我想知道是否有例外,或那些小部件不需要任何父母,或如果我用 new
声明它们出于某种原因,我必须delete
之后。
反之亦然...
根据我对代码的经验,我创建了很多(约 100 个)小部件和其他东西,既没有设置任何父级(之后也没有使用 delete
),并且该项目似乎在运行即使过了一段时间也没有任何停顿(但效果可能是潜在的,因为我没有运行 Memcheck),因此这个问题就在这里。
解决方法
是否每个小部件都需要/需要一个父级?
如果您希望它们被自动删除 - 是的。但是...
如果不是,有什么例外?如果是,没有父级的小部件会发生什么情况?
如果您使用 QLayout::addWidget
将小部件附加到布局,则不需要为小部件提供父级。如果您查看 source code,您会看到当您这样做时,它会自动将布局的父级附加为小部件的父级(除非您没有将布局附加到任何小部件)。
但是,如果您将使用 new
创建的小部件留在没有父级的情况下并且不附加到任何东西 - 它会泄漏内存。您必须使用 delete
或 QObject::deleteLater
删除它。当对象有任何连接时,建议使用最后一个选项。
一个没有父级的小部件是否保证在删除它所在的小部件(不需要它的父级)时会导致内存泄漏(或类似的东西)?或者如果它从布局中删除而没有发生任何删除?
正如我已经提到的,QLayout::addWidget
为添加的小部件设置父级,所以答案是否定的。另请注意,当您调用 QLayout::removeWidget
时,它仅从布局中删除 QLayoutItem
,但小部件的父级在调用 QLayout::addWidget
后保持不变。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。