有没有一种方法可以将ListModel的内容从QML获取到pyqt?

时间:2020-04-15 20:41:06

标签: python qt pyqt qml pyqt5

在我的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中提取数据吗?

1 个答案:

答案 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
        }
    }
}
相关问题