没有破解就无法获得在 PySide2 上工作的 QAbstractListModel 子类

Cannot get a QAbstractListModel subclass working on PySide2 without a hack

使用正在进行中的 PySide2(以便能够使用 Qt5),我有以下代码:

main.qml:

import QtQuick 2.0
import QtQuick.Controls 1.3

ApplicationWindow {
    visible: true
    ListView {
        width: 100
        height: 100
        model: listModel
        delegate: Text {
            text: model.name
        }
    }
}

main.py:

from sys import argv, exit

from PySide2.QtCore import QAbstractListModel
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine


class TaskListModel(QAbstractListModel):

    _COLUMNS = ('name',)

    def data(self, index, role):
        if role == self._COLUMNS.index('name'):
            return str(index.row())
        return None

    def roleNames(self):
        return dict(enumerate(self._COLUMNS))

    def rowCount(self, parent):
        return 1


app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty('listModel', None)
engine.load('main.qml')
engine.rootContext().setContextProperty('listModel', TaskListModel())
exit(app.exec_())

main.py 末尾对 engine 对象的 3 个方法调用是这样的,因为:

  1. 我得到 Unable to assign [undefined] to QString 如果我使用:

    engine.rootContext().setContextProperty('listModel', TaskListModel())
    engine.load('main.qml')
    
  2. 我得到 ReferenceError: listModel is not defined 如果我使用:

    engine.load('main.qml')
    engine.rootContext().setContextProperty('listModel', TaskListModel())
    

我的方法是正确执行此操作的唯一方法吗?我上面第一个项目符号中的代码不应该也有效吗?

如果将 PySide2 分配给某个变量,它似乎会从内存中删除 TaskListModel(),我找到了 2 个解决方案:

  • 创建一个存储模型的变量:

app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
model = TaskListModel()
engine.rootContext().setContextProperty('listModel', model)
engine.load('main.qml')
exit(app.exec_())
  • 将父项传递给模型:

app = QGuiApplication(argv)
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty('listModel', TaskListModel(engine))
engine.load('main.qml')
exit(app.exec_())