一个PyQt4的QObject能否被查询,以确定底层的C++实例是否已被销毁?

7

destroyed() 信号可以用于捕获 QObject,但我只想测试 Python 对象是否仍然引用有效的 C++ Qt 对象。是否有直接进行此操作的方法?


еңЁC++ QtдёӯпјҢжІЎжңүжҜ”жҚ•иҺ·destroyed()дҝЎеҸ·жӣҙе®№жҳ“зҡ„ж–№жі•пјҢеӣ жӯӨжҲ‘жҖҖз–‘еңЁPyQtдёӯжҳҜеҗҰеҸҜиғҪе®һзҺ°гҖӮ - smerlin
2个回答

15

如果你导入sip模块,就可以调用它的.isdeleted函数。

import sip
from PyQt4.QtCore import QObject

q = QObject()
sip.isdeleted(q)
False

sip.delete(q)
q
<PyQt4.QtCore.QObject object at 0x017CCA98>

q.isdeleted(q)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: underlying C/C++ object has been deleted

没有使用SIP(或Shiboken)是可能的吗? - eric
我发现在某些情况下,从PyQt导入sip的效果更好。可以这样做:from PyQt5 import sip - Presbitero

2
您可以使用 Python 标准库中的 WeakRef 类来完成。代码如下所示:

WeakRef

import weakref

q = QObject()
w = weakref.ref(q)

if w() is not None: # Remember the parentheses!
    print('The QObject is still alive.')
else:
    print('Looks like the QObject died.')

2
问题是关于Qt对象,而不是Python对象。即使这可能仅仅是偶然发生的,但这不是正确的方法。而且这比监听信号更费力。 - Rosh Oxymoron
@Rush:他问道:“我想简单地测试一下 Python 引用是否仍然有效。” 所以这正是它所做的。 - Peter C
1
抱歉,那个引用不太清楚。我是在询问关于底层的C++对象。我会修正问题的。 - Judge Maygarden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接