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