【问题标题】:Is there a way to get content of ListModel from QML to pyqt?有没有办法将 ListModel 的内容从 QML 获取到 pyqt?
【发布时间】:2020-07-28 23:37:42
【问题描述】:

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

【问题讨论】:

    标签: python qt pyqt qml pyqt5


    【解决方案1】:

    您不应直接导出到 QML 对象,而应使用 QObject 通过获取模型的槽获取 QML 对象,访问角色和值以将其保存在 .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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多