首页 > 解决方案 > 如何将表模型数据传递给 qml?

问题描述

我看到一些用 c++ 风格编写的代码,我尝试用 python 风格编写它。
我在 python 文件中编写了一个表模型,然后将其传递给 qml 文件。
但是当我运行我的main.py文件时,窗口什么也没有显示。
而且我的程序没有显示任何错误,我不知道这里出了什么问题?有人可以知道原因吗?

主文件

import os
from pathlib import Path
import sys

from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine

from PyQt5.QtCore import QAbstractTableModel, Qt


class TableModel(QAbstractTableModel):
    def __init__(self):
        super().__init__()

    def rowCount(self, parent):
        return 10

    def columnCount(self, parent) -> int:
        return 10

    def data(self, index, role: int):
        if index.isValid() and role == Qt.DisplayRole:
            return f"{index.row()},{index.column()}"

        return None

if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    engine.rootContext().setContextProperty('myModel', TableModel())
    engine.load(os.fspath(Path(__file__).resolve().parent / "table.qml"))
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

表.qml

import QtQuick 2.15
import QtQuick.Window 2.15

Window {
    width: 320
    height: 320
    visible: true

    TableView {
        anchors.fill: parent
        rowSpacing: 5
        columnSpacing: 5
        model: myModel
        delegate: myDele
    }

    Component {
        id: myDele
        Rectangle {
            implicitHeight: 50
            implicitWidth: 50
            width: 50
            height: 50
            color: "#abc"
            Text {
                anchors.centerIn: parent
                text: display
            }
        }
    }

}

结果
在此处输入图像描述

标签: pythonpython-3.xpyqt5qmlqqmlcontext

解决方案


问题是由内存管理引起的,最好分配给变量而不是将对象直接传递给方法,因为应该假设将使用该对象但不会管理其内存,除非文档指出。

在这种情况下,您必须将对象保存在变量中,然后使用它:

myModel = TableModel()
engine.rootContext().setContextProperty('myModel', myModel)

推荐阅读