0

使用正在进行的 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
        }
    }
}

主要.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.pyengine结束时对对象的 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())
    

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

4

1 回答 1

1

如果将其分配给某个变量,似乎会从内存中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_())
于 2018-01-23T04:03:18.100 回答