使用 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 中实现的附加函数,如下所示:
main.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_())
main.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的主要内容,如果未能解决你的问题,请参考以下文章