i am trying to insert/edit a python list that is subclassed from QAbstractListModel
in pyqt5. this python list is read in the model
property of ListView
element in qml. i have no issues displaying the data in qml. problem arises when i try to append new data into the python list.
the following is what i have done so far:
main.py:
import sys, model2
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView
class MainWindow(QQuickView):
def __init__(self, parent=None):
super().__init__(parent)
self.model = model2.PersonModel()
self.rootContext().setContextProperty('PersonModel', self.model)
self.rootContext().setContextProperty('MainWindow', self)
self.setSource(QUrl('test2.qml'))
myApp = QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(myApp.exec_())
model2.py
from PyQt5.QtCore import QAbstractListModel, Qt, pyqtSignal, pyqtSlot
class PersonModel(QAbstractListModel):
Name = Qt.UserRole + 1
Age = Qt.UserRole + 2
personChanged = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self.persons = [
{'name': 'jon', 'age': 20},
{'name': 'jane', 'age': 25}
]
def data(self, QModelIndex, role):
row = QModelIndex.row()
if role == self.Name:
return self.persons[row]["name"]
if role == self.Age:
return self.persons[row]["age"]
def rowCount(self, parent=None):
return len(self.persons)
def roleNames(self):
return {
Qt.UserRole + 1: b'name',
Qt.UserRole + 2: b'age'
}
@pyqtSlot()
def addData(self):
self.beginResetModel()
self.persons = self.persons.append({'name': 'peter', 'age': 22})
self.endResetModel()
print(self.persons)
@pyqtSlot()
def editData(self):
print(self.model.persons)
test2.qml:
import QtQuick 2.6
import QtQuick.Controls 2.2
Rectangle {
anchors.fill: parent
color: "lightgrey"
ListView {
id: listExample
anchors.fill: parent
model: PersonModel
delegate: Text {
text: name + " " + age
}
}
Button {
width: 50
height: 25
anchors.bottom: parent.bottom
text: "add"
onClicked: {
console.log("qml adding")
PersonModel.addData()
}
}
.
.
.
}
error occurs when i click the add button which calls the addData
method in model2.py. error lies in the rowCount
and error message says TypeError: object of type 'NoneType' has no len()
. do i have to emit the changes or pass in some index and role value so qml knows what is new/old and only reflect the changes accordingly?
any form of guidance is greatly appreciated!