亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

QQmlPropertyMap 插入;神秘地插入無,或刪除其他值

QQmlPropertyMap 插入;神秘地插入無,或刪除其他值

www說 2023-02-07 17:15:39
我在 PySide2 和 QML 工作,而 QQmlPropertyList 正在做兩件我覺得很奇怪的事情。第一個是如果 QObject 在同一語句中創建,則將其分配為值不起作用:from PySide2.QtCore import QObjectfrom PySide2.QtQml import QQmlPropertyMapqmap = QQmlPropertyMap()qmap.insert('test_key', QObject())print(qmap.value('test_key'))輸出:None也許這與 QObject 的初始化時間有關?它可以通過首先將它分配給一個變量來修復:qmap = QQmlPropertyMap()obj = QObject()qmap.insert('test_key', obj)print(qmap.value('test_key'))<PySide2.QtCore.QObject(0x7fe8f26b5eb0) at 0x107075ec0>但它變得陌生。忍受我。分配兩個 QObjects 工作:qmap = QQmlPropertyMap()obj = QObject()qmap.insert('test_key', obj)obj2 = QObject()qmap.insert('test_key2', obj2)print(qmap.value('test_key'))print(qmap.value('test_key2'))<PySide2.QtCore.QObject(0x7f85f7f269e0) at 0x10d32b080><PySide2.QtCore.QObject(0x7f85f7f26b70) at 0x10d32b100>我什至可以將同一個對象分配給多個鍵:qmap = QQmlPropertyMap()obj = QObject()qmap.insert('test_key', obj)qmap.insert('test_key2', obj)print(qmap.value('test_key'))print(qmap.value('test_key2'))<PySide2.QtCore.QObject(0x7fde37d7d9d0) at 0x105cdc140><PySide2.QtCore.QObject(0x7fde37d7d9d0) at 0x105cdc140>但是如果我為兩個不同的對象重用相同的變量名,第一個鍵的值會以某種方式被刪除:qmap = QQmlPropertyMap()obj = QObject()qmap.insert('test_key', obj)obj = QObject()qmap.insert('test_key2', obj)print(qmap.value('test_key'))print(qmap.value('test_key2'))None<PySide2.QtCore.QObject(0x7fcecaf072f0) at 0x111ba60c0>怎么會這樣?PySide 是否對運行時變量名做了某種隱藏的魔法?在這個例子中它是微不足道的,但它在我的代碼中導致了一個很難隔離的錯誤,我想更好地理解這一點。
查看完整描述

1 回答

?
慕娘9325324

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


查看完整回答
反對 回復 2023-02-07
  • 1 回答
  • 0 關注
  • 299 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號