如何将表模型数据传递给 qml?
Posted
技术标签:
【中文标题】如何将表模型数据传递给 qml?【英文标题】:How to pass table-model data to qml? 【发布时间】:2021-08-04 07:56:04 【问题描述】:我看到一些用 c++ 风格编写的代码,我尝试用 python 风格编写它。
我在 python 文件中编写了一个表模型,然后将其传递给 qml 文件。
但是当我运行 main.py
文件时,窗口什么也没有显示。
而且我的程序没有显示任何错误,我不知道这里出了什么问题?
有人能知道原因吗?
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_())
table.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
结果
【问题讨论】:
【参考方案1】:问题是由内存管理引起的,最好分配给变量而不是将对象直接传递给方法,因为应该假设将使用该对象但不会管理其内存,除非文档表示。
在这种情况下,您必须将对象保存在变量中然后使用它:
myModel = TableModel()
engine.rootContext().setContextProperty('myModel', myModel)
【讨论】:
就像我给它传递了一个临时变量,而qt没有保存我的变量?这种写作风格对于ptyhon用户来说是多余的。 @jett 不,Qt 并不表示它将拥有传递给 setContextProperty 方法的对象的所有权。 @jett 多余?非冗余代码与更少代码不同,在 python 中,显式优先于隐式,因此声明一个对象是最好的,因为它可以使其可读。我没有看到哪条 python 规则被破坏了,你能告诉我你从哪里得到这些信息吗?它是任何 PEP 的一部分吗? 没有任何信息指向这个,这是我个人的看法。 @jett 你应该说:在我看来......,因为当你使用“python用户”时,你似乎表明它是一个社区协议(或至少是一种非常普遍的做法)。以上是关于如何将表模型数据传递给 qml?的主要内容,如果未能解决你的问题,请参考以下文章