如何自动在python和qml更新中插入编辑QAbstractListModel?

如何自动在python和qml更新中插入编辑QAbstractListModel?,第1张

如何自动在python和qml更新中插入/编辑QAbstractListModel?

您收到的错误是由以下代码行引起的:

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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5668295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存