я пытаюсь вставить/отредактировать список python, который является подклассом QAbstractListModel
в pyqt5. этот список Python читается в свойстве model
элемента ListView
в qml. у меня нет проблем с отображением данных в qml. проблема возникает, когда я пытаюсь добавить новые данные в список python.
вот что я сделал до сих пор:
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()
}
}
.
.
.
}
ошибка возникает, когда я нажимаю кнопку добавления, которая вызывает метод addData
в model2.py. ошибка лежит в rowCount
и в сообщении об ошибке написано TypeError: object of type 'NoneType' has no len()
. нужно ли мне испускать изменения или передавать какое-либо значение индекса и роли, чтобы qml знал, что такое новое/старое, и только соответствующим образом отражал изменения?
любая форма руководства очень ценится!