微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决关于在 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

所以出现了一些问题:

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

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

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

反之亦然...

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

根据我对代码的经验,我创建了很多(约 100 个)小部件和其他东西,既没有设置任何父级(之后也没有使用 delete),并且该项目似乎在运行即使过了一段时间也没有任何停顿(但效果可能是潜在的,因为我没有运行 Memcheck),因此这个问题就在这里

解决方法

是否每个小部件都需要/需要一个父级?

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

如果不是,有什么例外?如果是,没有父级的小部件会发生什么情况?

如果您使用 QLayout::addWidget 将小部件附加到布局,则不需要为小部件提供父级。如果您查看 source code,您会看到当您这样做时,它会自动将布局的父级附加为小部件的父级(除非您没有将布局附加到任何小部件)。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。