Issue
I have a QML that represent schedule, that get values from database, so I need insert values to ListModel
from my python code. QML looks like that:
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
}
}
}
And I a function, that should insert values to 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")
I have no ideas how to do that. Could you help me, please? I'm using Python2.7, PyQt5.9, QtQuick2.5
Solution
For this task you can invoke the append function that you have implemented in the .qml through QMetaObject.invokeMethod()
as shown below:
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
}
}
}
The complete example can be found at the following link
Answered By - eyllanesc
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.