在我的TableView
中,有ListModel
位用户填写。我想使用python将模型保存为.csv文件。但是我无法通过qml信号将模型发送给pyqt(模型没有类型),并且如果我想使用此行在python中访问此ListModel
。
Python
model = self.engine.rootObjects()[0].findChild(QObject, "newCsvModel")
作为回报,我得到QAbstractListModel
,根据我的理解,它不包含模型内容。
QML
这就是我使用模型的方式
TableView {
model: ListModel{
id: csvModel
objectName: "newCsvModel"
ListElement{
key1: "val1"
key2: "val2"
...
}
...
}
我有一个用于将模型的确切类型从pyqt发送到qml的类,它可以正常工作,但是反过来对我来说是个难题。您知道如何从qml ListModel中提取数据吗?
答案 0 :(得分:0)
您不应直接导出到QML对象,而应使用通过插槽获取QML对象的QObject,以获取模型,访问角色和值以将其保存为.csv。
import csv
from PyQt5 import QtCore, QtGui, QtQml
class CSVHelper(QtCore.QObject):
@QtCore.pyqtSlot("QAbstractItemModel*", str)
def saveListModel(self, model, filename):
headers = {v.data().decode(): k for k, v in model.roleNames().items()}
with open(filename, mode="w") as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=headers.keys())
writer.writeheader()
for i in range(model.rowCount()):
row = dict()
for name, role in headers.items():
value = model.index(i, 0).data(role)
row[name] = value
writer.writerow(row)
if __name__ == "__main__":
import os
import sys
app = QtGui.QGuiApplication(sys.argv)
csv_helper = CSVHelper()
engine = QtQml.QQmlApplicationEngine()
engine.rootContext().setContextProperty("CSVHelper", csv_helper)
file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "main.qml")
engine.load(QtCore.QUrl.fromLocalFile(file))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec())
main.qml
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Controls 1.4
ApplicationWindow {
id: root
visible: true
width: 640
height: 480
ListModel {
id: libraryModel
ListElement {
title: "A Masterpiece"
author: "Gabriel"
}
ListElement {
title: "Brilliance"
author: "Jens"
}
ListElement {
title: "Outstanding"
author: "Frederik"
}
}
Column{
Button {
text: "Press me"
onClicked: CSVHelper.saveListModel(libraryModel, "data.csv")
}
TableView {
width: root.width
height: 400
TableViewColumn {
role: "title"
title: "Title"
width: 100
}
TableViewColumn {
role: "author"
title: "Author"
width: 200
}
model: libraryModel
}
}
}