QListView拒绝显示子类QAbstractListModel

时间:2017-05-04 20:21:17

标签: python user-interface pyqt5 qt5.8

我试图让自定义ListModel工作并在PyQt中显示。但是列表视图总是空白。我检查过UserModel.users确实有它应该拥有的项目,dataChanged正常触发,但是没有显示任何内容。 同时,数据中的print(index)从不输出任何内容,因此模型数据永远不会被调用? 我错过了什么?

    self.userList = QtWidgets.QListView()
    self.userList.setModel(self.main.commandHandler.userList)
    self.userList.show()

class UserModel(QAbstractListModel):
    def __init__(self, parent=None):
        QAbstractListModel.__init__(self, parent) 
        self.users = []

    def rowCount(self, parent = None) :
        if parent != None:
            return 0
        return len(self.users)

    def flags(self):
        return Qt.NoItemFlags

    def data(self, index, role = Qt.DisplayRole ):
        print(index)
        name = self.users[index].name
        if index.isValid():
            if (role == Qt.DisplayRole):
                return QVariant(name)
        else:
            return QVariant()

    def addUser(self, payload):
        user = User(payload)
        l = len(self.users)
        self.users.append(user)
        self.dataChanged.emit(self.index(l, 0), self.index(l, 0))

1 个答案:

答案 0 :(得分:0)

您需要致电beginInsertRowsendInsertRows - dataChanged仅适用于现有项目。

您可能希望在模型上运行pytest-qt's modeltester以查找更多问题。

另外,请注意QStandardItemModelQStringListModel,如果您的实际模型与示例一样简单,则可能更容易使用。