您收到的错误是由以下代码行引起的:
self.persons = self.persons.append({'name': 'peter', 'age': 22})
造成此问题的原因是append函数未返回任何内容,因此应将None分配给self.persons
要插入新数据,您必须调用
beginInsertRows()并将
endInsertRows()更改通知给视图。
数据方法必须与文档中显示的方法相同,即它必须具有以下格式:
def data(self, index, role=Qt.DisplayRole):
与rowCount方法相同:
def rowCount(self, parent=QModelIndex()):
我已经实现了addPerson,editPerson和deletePerson方法,分别从列表中添加,编辑和删除数据。另外,我在.qml中添加了必要的项目以进行测试。
model2.py
from PyQt5.QtCore import QAbstractListModel, Qt, pyqtSignal, pyqtSlot, QModelIndexclass PersonModel(QAbstractListModel): NameRole = Qt.UserRole + 1 AgeRole = 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, index, role=Qt.DisplayRole): row = index.row() if role == PersonModel.NameRole: return self.persons[row]["name"] if role == PersonModel.AgeRole: return self.persons[row]["age"] def rowCount(self, parent=QModelIndex()): return len(self.persons) def roleNames(self): return { PersonModel.NameRole: b'name', PersonModel.AgeRole: b'age' } @pyqtSlot(str, int) def addPerson(self, name, age): self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount()) self.persons.append({'name': name, 'age': age}) self.endInsertRows() @pyqtSlot(int, str, int) def editPerson(self, row, name, age): ix = self.index(row, 0) self.persons[row] = {'name': name, 'age': age} self.dataChanged.emit(ix, ix, self.roleNames()) @pyqtSlot(int) def deletePerson(self, row): self.beginRemoveColumns(QModelIndex(), row, row) del self.persons[row] self.endRemoveRows()
test2.qml
import QtQuick 2.6import QtQuick.Controls 2.2Rectangle { anchors.fill: parent color: "lightgrey" ListView { id: listExample anchors.fill: parent model: PersonModel delegate: Item { width: 200 height: 60 Row { Text { width: 60 text: name + " " + age horizontalAlignment: Text.AlignHCenter anchors.verticalCenter: parent.verticalCenter } Button{ width: 20 text: "+" onClicked: PersonModel.editPerson(index, name, age+1) } Button{ width: 20 text: "-" onClicked: PersonModel.editPerson(index, name, age-1) } Button{ width: 20 text: "X" onClicked: PersonModel.deletePerson(index) } } } } Button { width: 50 height: 25 anchors.bottom: parent.bottom anchors.right: parent.right text: "add" onClicked: { console.log("qml adding") PersonModel.addPerson("luis", 22) } }}
编辑:
.py
@pyqtSlot(int, str, int)def insertPerson(self, row, name, age): self.beginInsertRows(QModelIndex(), row, row) self.persons.insert(row, {'name': name, 'age': age}) self.endInsertRows()
.qml
PersonModel.insertPerson(2, "luis", 1111)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)