QListView 拒绝显示子类化的 QAbstractListModel

Posted

技术标签:

【中文标题】QListView 拒绝显示子类化的 QAbstractListModel【英文标题】:QListView refuses to show subclassed QAbstractListModel 【发布时间】:2017-05-04 20:21:16 【问题描述】:

我正在尝试让自定义 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】:

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

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

另外,请注意 QStandardItemModel 和 QStringListModel 如果您的实际模型像您的示例一样简单,它们可能更容易使用。

【讨论】:

我尝试添加 beginInsertRows 和 endInsertRows,它没有改变任何东西。至于尝试 pytestqt,测试仪似乎也有些不对劲。它在 hasIndex 中返回一个错误,我不会覆盖,也不应该覆盖。 你能打开 an issue 的模型和你得到的确切错误吗?

以上是关于QListView 拒绝显示子类化的 QAbstractListModel的主要内容,如果未能解决你的问题,请参考以下文章

子类化的 MKTileOverlay 不在地图上显示

如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景

PyQt5-高级控件使用(QListView)

QListView 项目背景颜色

PyQt5 组件之QListView

QTableView() 仅在选择时更新更改