QTreeView 的 QAbstractItemModel:我做错了什么?

QAbstractItemModel for QTreeView: what an I doing wrong?

我想创建一个子类 a QAbstractItemModel 以便在 QTreeView 中使用它。起初,我决定制作一个不支持任何层次结构的简约模型。它应该给出一个 2×3 table 和简单的文本数据(read-only 一个)。

唉,它没有崩溃但没有显示任何数据:只有几列 headers (1, 2)。不能有人告诉我,我做错了什么吗?

import os, sys

from PyQt5 import QtWidgets, QtCore, QtGui, QtSvg

from PyQt5.QtCore import QPointF, QRectF
from PyQt5.QtWidgets import QGraphicsItem


from gui.graphic_items import *



class MegaModel(QtCore.QAbstractItemModel):
    def __init__(self, parent=None):
        super().__init__(parent)

        self._root_item = 7.40
        pass

    def columnCount(self, parent_index):
        if parent_index.isValid():
            return 0
        else:
            return 2

    def rowCount(self, parent_index):
        if parent_index.isValid():
            return 0
        else:
            return 3

    def data(self, index, role):
        if index.isValid():
            return QtCore.QVariant("Oy vey!")
        else:
            return None

    def index(self, row, column, parent=QtCore.QModelIndex()):
        print("index", row, column, parent)

        if parent.isValid():
            print("valid")
            return parent.internalPointer()
        else:
            print("invalid")
            return self.createIndex(row, column, self._root_item)

    def parent(self, index):
        return QtCore.QModelIndex()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)


    mega_view = QtWidgets.QTreeView()

    mega_model = MegaModel()

    mega_view.setModel(mega_model)

    mega_view.show()

    sys.exit(app.exec_())

两个错误:

  1. 您不应该 return parent.internalPointer() 来自 index 方法 - 此方法不 return 模型的存储值,它仅用于 return 模型项目的索引
  2. data 方法中,您 return QtCore.QVariant("Oy vey!") 用于所有角色。对于 QtCore.Qt.DisplayRole,您真的应该只 return 这个,对于其他角色,return None:

    是可以的
    def data(self, index, role):
        if not index.isValid():
            return None
        if role == QtCore.Qt.DisplayRole:
            return index.internalPointer()
        else:
            return None