从 QML 访问 Python QObject 在第二次调用时无法转换

问题描述 投票:0回答:1

我的 Python3 QML 程序遇到了一个晦涩的问题(bug?)。 我使用自定义 get 方法实现了 QAbstractListModel 来获取底层 QObject 项。当我尝试在 QML 中的两个不同位置获取相同的 Python QObject 时,我得到:

TypeError: unable to convert a Python 'QMyItem' object to a C++ 'QObject*' instance

get方法如下所示:

@pyqtSlot(int, result=QMyItem)
def get(self, row):
    return self._items[row]

模型是这样的:

ComboBox {
    model: mymodel
    textRole: 'name'
    onActivated: mymodel.item = model.get(index)
    onModelChanged: currentIndex = getCurrentIndex(mymodel, mymodel.item)
}

问题实际上与我检索 QObject 的方式无关。它似乎确实是关于 Python 到 QML 的转换。就好像转换器保留了已传递引用的列表并以某种方式失去同步。

我现在有一个显示错误的最小示例。https://github.com/sturmf/python_samples.git获取源代码并进入文件夹

pyqt_combobox_qabstractlistmodel
。在那里以
python3 main.py
开始示例。在显示的组合框中,您可以选择项目
three
,但项目
one
会在控制台上显示错误。原因是第一项已经从 Python 传递到 QML 一次,并且第二次就不起作用了。

也许转换后的 QObject 在 QML 端以某种方式进行了垃圾收集?

python qt pyqt qml
1个回答
11
投票

所以问题是,在我将对象交给 QML 后,QML 端垃圾收集了我的对象。原因是我从未为这些 QObject 设置父级。

© www.soinside.com 2019 - 2024. All rights reserved.