[PyQt] (PyQt5) QGraphicsRectItem container is not destroyed

Justin Iurman justin.iurman at uliege.be
Tue Jul 17 02:08:04 BST 2018


Hi everyone,

Here is the context:

- a QWidget (Node > QLabel) is added to a QGraphicsScene
- a QGraphicsProxyWidget is returned, embedding the QWidget
- a movable container (NodeContainer > QGraphicsRectItem) wraps up the proxy

Simplified hierarchy (parent -> child): container -> proxy -> node.

container = NodeContainer()
self.scene.addItem(container)

proxy = self.scene.addWidget(node)
proxy.setParentItem(container)

So far, so good. Anyway, when it comes down to removing a node, I just noticed that both the proxy and the node are deleted as expected, while the container is not. Here is deletion part:

proxy = node.graphicsProxyWidget()
container = proxy.parentItem()

self.scene.removeItem(proxy)
self.scene.removeItem(container)

node.deleteLater()
proxy.deleteLater()

I know that some instructions may be useless because of some others. I just wanted to make sure I tried every possible way to delete each part.

Do you have an idea of why the container is not destroyed ?

Debug hint: running sip.isdeleted(container) on the container shows False and the object is still reachable. When running sip.delete(container) then again sip.isdeleted(container) it now shows True (and it is not reachable anymore, obviously). Also checked with sys.getrefcount(container).

Also, when running

print(sip.ispyowned(container))
print(sip.dump(container))

1) before deletion

False
<__main__.NodeContainer object at 0x7f9b6cf44af8>
    Reference count: 3
    Address of wrapped object: 0x19d9610
    Created by: Python
    To be destroyed by: C/C++
    Parent wrapper: <PyQt5.QtWidgets.QGraphicsScene object at 0x7f9b6cf41f78>
    Next sibling wrapper: <__main__.Link object at 0x7f9b6cf44798>
    Previous sibling wrapper: <__main__.Host object at 0x7f9b6cf449d8>
    First child wrapper: <PyQt5.QtWidgets.QGraphicsProxyWidget object at 0x7f9b6cf44c18>

2) after deletion

True
<__main__.NodeContainer object at 0x7f9b6cf44af8>
    Reference count: 2
    Address of wrapped object: 0x19d9610
    Created by: Python
    To be destroyed by: Python
    Parent wrapper: NULL
    Next sibling wrapper: NULL
    Previous sibling wrapper: NULL
    First child wrapper: NULL

One can see that the container is now owned by Python after deletion. Why ?
Thanks,

Justin


More information about the PyQt mailing list