如何将 table-模型数据传递给 qml?
How to pass table-model data to qml?
我看到一些代码是用c++风格写的,我试着用python风格来写。
我在python文件中写了一个table模型,然后传给qml文件。
但是当我 运行 我的 main.py
文件时, windows 什么都不显示。
我的程序没有显示任何错误,我不知道这里出了什么问题?
有人可以知道原因吗?
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
}
}
}
}
结果
问题出在内存管理上,分配给变量比直接将对象传递给方法要好,因为应该假定对象将被使用但其内存不会被管理,除非文档指出。
在这种情况下,您必须将对象保存在一个变量中,然后再使用它:
myModel = TableModel()
engine.rootContext().setContextProperty('myModel', myModel)
我看到一些代码是用c++风格写的,我试着用python风格来写。
我在python文件中写了一个table模型,然后传给qml文件。
但是当我 运行 我的 main.py
文件时, windows 什么都不显示。
我的程序没有显示任何错误,我不知道这里出了什么问题?
有人可以知道原因吗?
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
}
}
}
}
结果
问题出在内存管理上,分配给变量比直接将对象传递给方法要好,因为应该假定对象将被使用但其内存不会被管理,除非文档指出。
在这种情况下,您必须将对象保存在一个变量中,然后再使用它:
myModel = TableModel()
engine.rootContext().setContextProperty('myModel', myModel)