1 回答

TA貢獻1783條經驗 獲得超4個贊
當您創建一個對象并為其分配相同的變量時,前一個對象被銷毀,可以通過以下測試觀察到:
class Foo:
def __del__(self):
print("destroyed")
print("before creating Foo object: 1")
foo = Foo()
print("after creating Foo object: 1")
print("before creating Foo object: 2")
foo = Foo()
print("after creating Foo object: 2")
輸出
before creating Foo object: 1
after creating Foo object: 1
before creating Foo object: 2
destroyed
after creating Foo object: 2
destroyed
正如您所看到的,當第二個對象被分配給同一個變量時,第一個銷毀被調用。所以這不是 PySide2 的魔力而是 python 的魔力,同樣可以用被破壞的信號來驗證。
from PySide2.QtCore import QObject
print("before creating QObject object: 1")
qobject = QObject()
qobject.destroyed.connect(lambda _id=id(qobject): print("destroyed1: ", _id))
print("after creating QObject object: 1")
print("before creating QObject object: 2")
qobject = QObject()
qobject.destroyed.connect(lambda _id=id(qobject): print("destroyed2: ", _id))
print("after creating QObject object: 2")
輸出:
before creating QObject object: 1
after creating QObject object: 1
before creating QObject object: 2
destroyed1: <PySide2.QtCore.QObject(0x562c1b6ee2f0) at 0x7f4a1faece40>
after creating QObject object: 2
如果你不希望這個問題發生,那么使用 Qt 的超能力,你可以將對象作為“qmap”的父對象傳遞,這樣所有權將由 QObject 持有,它將不再由 python 處理:
from PySide2.QtCore import QObject
from PySide2.QtQml import QQmlPropertyMap
qmap = QQmlPropertyMap()
obj = QObject(qmap)
qmap.insert("test_key", obj)
obj = QObject(qmap)
qmap.insert("test_key2", obj)
print(qmap.value("test_key"))
print(qmap.value("test_key2"))
輸出:
<PySide2.QtCore.QObject(0x559629d1e230) at 0x7fef951f01c0>
<PySide2.QtCore.QObject(0x559629d1eae0) at 0x7fef951f0240>
更新:
為了更好地理解,我們必須知道PySide2(PyQt5也適用)的QObject是Qt的QObject的包裝器,也就是說,它是這樣的:
class PyQObject:
def __init__(self, *args):
self._qobject_cpp = CPPQObject(*args)
# ...
def __del__(self):
delete self._qobject_cpp
添加回答
舉報