Можно ли запросить PyQt4 QObject, чтобы определить, был ли уничтожен базовый экземпляр C++?

Сигнал destroyed() может быть перехвачен для QObject, но я хотел бы просто проверить, ссылается ли объект Python на допустимый объект C++ Qt. Есть ли способ сделать это напрямую?


person Judge Maygarden    schedule 25.02.2011    source источник
comment
В C++ Qt нет более простой возможности, чем поймать сигнал destroyed(), поэтому я сомневаюсь, что это возможно с PyQt.   -  person smerlin    schedule 26.02.2011


Ответы (2)


Если вы импортируете модуль 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
person Gary Hughes    schedule 01.03.2011
comment
можно ли без sip (или shiboken)? - person eric; 23.08.2014
comment
Я обнаружил, что импорт sip из PyQt в некоторых случаях работает лучше. Выполнено как from PyQt5 import sip. - person Presbitero; 14.08.2020

Вы можете использовать класс WeakRef из стандартной библиотеки Python. Это будет выглядеть примерно так:

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.')
person Peter C    schedule 25.02.2011
comment
Вопрос касается объекта Qt, а не объекта Python. Даже если это может сработать по чистой случайности, но это не способ сделать это. И это больше работы, чем слушать сигнал. - person Rosh Oxymoron; 26.02.2011
comment
@Rush: Он спросил, хочу ли я просто проверить, действительна ли ссылка на Python. Так что это именно то, что это делает. - person Peter C; 26.02.2011
comment
Извините, цитата непонятна. Я спрашиваю о базовом объекте С++. Я исправлю вопрос. - person Judge Maygarden; 27.02.2011