使用 PyQt 将项目动态设置为 QML ListModel

Posted

技术标签:

【中文标题】使用 PyQt 将项目动态设置为 QML ListModel【英文标题】:Set items to QML ListModel dynamicaly with PyQt 【发布时间】:2017-10-13 03:12:53 【问题描述】:

我有一个表示计划的 QML,它从数据库中获取值,所以我需要从我的 python 代码中将值插入到ListModel。 QML 看起来像这样:

function append(newElement) 
    scheduleList.model.append(newElement)


ListView 
    id: scheduleList
    model: scheduleModel
    delegate: scheduleItem

    section.property: "day"
    section.delegate: sectionDelegate


Component 
    id: scheduleItem
    Rectangle 
        Row 
            spacing: 15
            Text 
                text: lesson
            
            Text 
                text: subject
            
        
    


Component 
    id: sectionDelegate
    Rectangle 
        id: root
        Text 
            id: label
            text: section
        
    

我是一个函数,应该向 QML ListModel 插入值:

class ScheduleView(QObject):
    def __init__(self, parent=None):
        QObject.__init__(self, parent=parent)
        self._presenter = SchedulePresenter(self)
        self._widget = QQuickWidget(parent)
        self._widget.rootContext().setContextProperty('scheduleView', self)
        self._widget.rootContext().setContextProperty('groupsModel', self)
        self._widget.setSource(QUrl('modules/schedule/Form.qml'))

def reprSchedules(self):
    values = ["lesson": "1", "subject": "PE", "day": "Monday",
              "lesson": "2", "subject": "PE", "day": "Monday",
              "lesson": "3", "subject": "PE", "day": "Monday"]
    #model = self._widget.rootObject().findChild(QObject, "scheduleModel")

我不知道该怎么做。请问你能帮帮我吗?我正在使用 Python2.7、PyQt5.9、QtQuick2.5

【问题讨论】:

【参考方案1】:

对于此任务,您可以通过QMetaObject.invokeMethod() 调用您在.qml 中实现的附加函数,如下所示:

ma​​in.py

counter = 0

def onTimeout(obj):
    global counter
    value = "lesson": str(counter), "subject": "PE", "day": QDate.longDayName(1 + counter % 7)
    QMetaObject.invokeMethod(obj, "append", Q_ARG(QVariant, value))
    counter += 1


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QQuickWidget()
    w.setSource(QUrl('main.qml'))
    timer = QTimer()
    timer.timeout.connect(lambda: onTimeout(w.rootObject()))
    timer.start(1000)
    w.show()
    sys.exit(app.exec_())

ma​​in.qml

import QtQuick 2.0

Rectangle 
    width: 640
    height: 480

    function append(newElement) 
        scheduleModel.append(newElement)
    
    ListModel 
        id: scheduleModel
    

    ListView 
        anchors.fill: parent
        id: scheduleList
        model: scheduleModel
        delegate: scheduleItem

        section.property: "day"
        section.delegate: sectionDelegate
    


    Component 
        id: scheduleItem
            Row 
                spacing: 15
                Text 
                    text: lesson
                
                Text 
                    text: subject
                
        
    

    Component 
        id: sectionDelegate
            Text 
                id: label
                text: section
            
    

完整的例子可以在以下link找到

【讨论】:

Updated link

以上是关于使用 PyQt 将项目动态设置为 QML ListModel的主要内容,如果未能解决你的问题,请参考以下文章

将属性注入 QML 组件

将 QML 中的 QSortFilterProxyModel 与 PyQt5 一起使用

PyQt5 与 QML

如何从QML基本类型列表中动态删除元素?

使用 PyQt 将基于 qml 的图表集成到现有的 ui

如何将 .qml 扩展名更改为 .ui 以在 pyqt5 应用程序中使用它