- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个布局,我添加了很多自定义小部件,例如 layout.addWidget(widget)
.稍后我想删除所有这些自定义小部件并添加新小部件。当谈到 deleteLater
时,我对执行此操作的最佳方法感到困惑。和 setParent(None)
.例如,这是我为布局中的所有小部件调用的清理函数:
def _removeFilterWidgetFromLayout(self, widget):
"""Remove filter widget"""
self._collection_layout.removeWidget(widget)
widget.setParent(None)
widget.deleteLater()
widget
的引用发生了什么。 .
removeWidget
然后父关系被打破,所以我必须自己清理 C++ 和 Python 引用,因为小部件没有其他父级。调用
setParent
是删除与布局的父关系的显式方法。调用
deleteLater
旨在处理 C++ 引用。
widget
变量超出范围,并且没有其他 Python 对象指向
widget
.
setParent
和
deleteLater
或会
deleteLater
足以正确清理这个吗?
setParent(None)
在这种情况下是一个非常昂贵的函数调用。通过删除这个调用,我可以大大加快我的整个清理过程。我不确定
deleteLater
足以正确清理所有内容。这是我的分析输出
line_profiler
:
Line # Hits Time Per Hit % Time Line Contents
==============================================================
2167 @profile
2168 def _removeFilterWidgetFromLayout(self, widget):
2169 """Remove filter widget"""
2170
2171 233 1528 6.6 1.0 self._collection_layout.removeWidget(widget)
2172 233 143998 618.0 97.9 widget.setParent(None)
2173 233 1307 5.6 0.9 widget.deleteLater()
setParent
,
deleteLater
, 或两者?
最佳答案
了解实际情况的最简单方法可能是在交互式 session 中逐步完成:
>>> parent = QtGui.QWidget()
>>> child = QtGui.QWidget()
>>> layout = QtGui.QHBoxLayout(parent)
>>> layout.addWidget(child)
>>> child.parent() is layout
False
>>> child.parent() is parent
True
>>> item = layout.itemAt(0)
>>> item
<PyQt4.QtGui.QWidgetItem object at 0x7fa1715fe318>
>>> item.widget() is child
True
>>> layout.removeWidget(child)
>>> child.parent() is parent
True
>>> layout.count()
0
>>> repr(layout.itemAt(0))
'None'
>>> item
<PyQt4.QtGui.QWidgetItem object at 0x7fa1715fe318>
>>> child.deleteLater()
>>> parent.children()
[<PyQt4.QtGui.QHBoxLayout object at 0x7fa1715fe1f8>]
>>> child.parent()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: wrapped C/C++ object of type QWidget has been deleted
>>>
deleteLater
在上面。从回溯中可以看出,这将删除底层的 C++ 对象,但它的 python 包装器对象将被留下。但是,一旦任何剩余的对它的 python 引用消失,垃圾收集器将(最终)删除这个包装器。请注意,永远不需要调用
setParent(None)
。在这个过程中。
deleteLater
的影响立即看到,如果代码作为脚本运行则不会出现这种情况。要在脚本中立即删除,您需要使用
sip
模块:
>>> import sip
>>> sip.delete(child)
关于PyQt4 setParent vs deleteLater,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30241684/
我正在考虑编写这段代码: emit finished(); deleteLater(); 但这让我想知道 finished() 是否总是在对象被删除之前交付。我很确定它将为 Qt::DirectCon
这个问题在这里已经有了答案: How delete and deleteLater works with regards to signals and slots in Qt? (4 个答案) 关闭
Qt deleteLater作用及源码分析 个人经验总结,如有错误或遗漏,欢迎各位大佬指正 🥳 在本篇文章中,我们将深入分析源码,探讨 deleteLater 的原理。
我有一个布局,我添加了很多自定义小部件,例如 layout.addWidget(widget) .稍后我想删除所有这些自定义小部件并添加新小部件。当谈到 deleteLater 时,我对执行此操作的最
这个问题在这里已经有了答案: QObject::deleteLater across a QThread (3 个答案) 关闭 3 年前。 是否可以执行以下操作? worker->moveToThr
Qt 表示 deleteLater 在事件循环返回后被调用。所以,如果我有以下代码: Waypoint* wp = new Waypoint(); WaypointWidget* wp_widge
准系统示例: Object * o = new Object(); //let's call this one object A on heap o->deleteLater(); o = new O
我有一个用 C++ 和 Qt 编写的应用程序,它执行大量网络请求。我的代码的基本大纲如下: { QNetworkReply* reply = networkAccessManager().ge
我正在寻找一种解决方案来安排跨线程删除对象。关于 deleteLater 行为方式的文档并不完全清楚。我可以在不是对象所有者的线程中调用此函数吗? 例如,对象 X 由线程 A 拥有,而在线程 B 中我
我遇到这样一种情况,QSharedPointer 托管对象发出信号表示它已完成其目的并准备好很快删除(在执行后离开函数发出我的 readyForDeletion 信号) .当使用普通 指针时,我只是在
所以我有一个函数可以发出网络请求: void MyClass::makeRequest() { ApiRequest* apiRequest = new ApiRequest(); a
既然Python中已经有了垃圾收集器,那么在PyQt/PySide中还需要deleteLater()吗? 最佳答案 这取决于你所说的“必要”是什么意思。 如果(例如)在关闭小部件时不小心,应用程序可能
通常,当我删除一个对象时,我会将其设置为零。这有助于我编写例程来检查对象不为零,然后继续。 但是,如果我使用 deleteLater() 函数,我将失去对它的控制。我不知道它是否是一个有效的项目,或者
虽然我通过 PyQt 从 Python 使用 Qt,这个问题同样适用于纯 Qt,只是语法有点不同,问题是一样的: 当我们想要在场景中处理 QGraphicsItem 对象时,我们调用 scene.re
我想了解使用 sip.delete() 删除小部件(包括它的布局和此布局中的子项)有什么区别和 deleteLater() .我知道removeWidget()和 setParent(None)只是从
我希望我的 std::unique_ptr 调用 QObject::deleteLater 来破坏该对象。 我不知道该怎么做。 我尝试过的任何方法都无法编译。 例如 std::unique_ptr v
我尝试使用 QTcpSserver,它会一次与一个且仅一个客户端保持连接,直到客户端断开连接。所以,我在我的类中保留了一个成员指针。 问题就出在这里:我在网上看到的例子,在disconnected()
我正在测试一个共享库,其中包含内部对 deleteLater 的调用。库中没有运行事件循环,因此应用程序需要运行事件循环,以便正确释放所有内存。 但是在测试中,对象dtor并没有像预期的那样被调用。
发件人:http://doc.qt.io/qt-5/qthread.html#details From Qt 4.8 onwards, it is possible to de
请考虑下面的最小示例,它实现了一个自定义 QNetworkAccessManager,它维护一个未完成的 QNetworkReply 实例列表。 当回复完成时,它会从unfinished_replie
我是一名优秀的程序员,十分优秀!