首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QAbstractListModel与QML同步

将QAbstractListModel与QML同步
EN

Stack Overflow用户
提问于 2021-10-31 13:23:13
回答 1查看 34关注 0票数 0

我有一个实现QAbstractListModel的简单StudentListModel类。

代码语言:javascript
复制
class StudentListModel(QAbstractListModel):
    NAME = Qt.UserRole + 1
    AGE = Qt.UserRole + 2

    def __init__(self, students):
        super().__init__()
        self.students = students

    def roleNames(self):
        return {
            StudentListModel.NAME: b'name',
            StudentListModel.AGE: b'age',
        }

    def rowCount(self, parent=None, *args, **kwargs):
        return len(self.students)

    def data(self, QModelIndex, role=None):
        row = self.students[QModelIndex.row()]

        if role == StudentListModel.NAME:
            return row["name"]
        elif role == StudentListModel.AGE:
            return row["age"]

        return None

    def remove(self, index):
        self.students.pop(index)

将StudentListModel传递给QML文件。QML将显示models条目。

代码语言:javascript
复制
import QtQuick 2.15
import QtQuick.Controls 2.15

Rectangle {
  id: container

  signal remove(int index)

  Column {
      spacing: 15

      Repeater {
          model: studentListModel

          Row {
              spacing: 10

              Text {
                  text: model.name
              }

              Button {
                  text: "Remove"
                  onClicked: container.remove(index)
              }
          }
      }
  }
}

连接QML和StudentListModel的代码如下所示:

代码语言:javascript
复制
def main():
    students = [
        {"name": "Vitaliy  ", "age": "21"},
        {"name": "Eugene", "age": "26"},
        {"name": "Tommy", "age": "26"}
    ]

    model = StudentListModel(students)

    app = QApplication(sys.argv)
    widget = QQuickWidget()

    widget.setSource(QUrl('stack.qml'))
    widget.rootContext().setContextProperty('studentListModel', model)
    widget.rootObject().remove.connect(lambda index: model.remove(index))

    widget.setGeometry(0, 0, 320, 800)
    widget.show()

    return app.exec_()


if __name__ == '__main__':
    sys.exit(main())

以下是该应用程序的运行截图:

在QML中显示模型条目没有问题。问题是当我想要删除一个条目的时候。当我单击remove时,QML获取所单击条目的索引并发送一个信号。main()块将通过lambda函数处理信号发送。Lambda函数将接收索引,并通过传递接收到的索引从模型中调用remove方法。在此之后,模型将删除条目,但是QML不会显示更新后的模型。有没有办法将模型与QML同步,这样当一个条目被删除时,它也会在QML中被删除?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-31 16:45:13

您必须在删除之前和之后分别调用beginRemoveRows和endRemoveRows方法:

代码语言:javascript
复制
class StudentListModel(QAbstractListModel):
    NAME = Qt.UserRole + 1
    AGE = Qt.UserRole + 2

    def __init__(self, students):
        super().__init__()
        self.students = students

    def roleNames(self):
        return {
            StudentListModel.NAME: b"name",
            StudentListModel.AGE: b"age",
        }

    def rowCount(self, parent=QModelIndex()):
        return len(self.students)

    def data(self, index, role=Qt.DisplayRole):
        row = self.students[index.row()]

        if role == StudentListModel.NAME:
            return row["name"]
        elif role == StudentListModel.AGE:
            return row["age"]

    def remove(self, index):
        self.beginRemoveRows(QModelIndex(), index, index)
        self.students.pop(index)
        self.endRemoveRows()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69787314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档