QTreeView 的 QAbstractItemModel:我做错了啥?

Posted

技术标签:

【中文标题】QTreeView 的 QAbstractItemModel:我做错了啥?【英文标题】:QAbstractItemModel for QTreeView: what an I doing wrong?QTreeView 的 QAbstractItemModel:我做错了什么? 【发布时间】:2017-03-02 11:18:05 【问题描述】:

我想创建一个子类QAbstractItemModel 以在QTreeView 中使用它。起初,我决定制作一个不支持任何层次结构的简约模型。它应该提供一个包含简单文本数据的 2×3 表格(只读)。

唉,它没有崩溃但没有显示任何数据:只有几个列标题(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_())

【问题讨论】:

如果parent 索引有效,为什么要从index 方法返回parent.internalPointer() 好吧,我刚刚尝试将其修改为在parent 有效时返回QtCore.QModelndex()。没有任何变化,没有出现所需的单元格... 还有第二个错误,看我的回答。 【参考方案1】:

两个错误:

    您不应该从 index 方法返回 parent.internalPointer() - 此方法不返回模型的存储值,它只返回模型项的索引

    data 方法中,您为所有角色返回QtCore.QVariant("Oy vey!")。你真的应该只为QtCore.Qt.DisplayRole返回这个,对于其他角色可以返回None

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

【讨论】:

谢谢同志!就是这样! // Добра тебе, умный человек! ^_^ 另外,你不能看看这个吗? ***.com/questions/42565139/… UPD:已经修复,tree.siblings() 只给出了一个节点的兄弟姐妹(节点本身没有列出)。

以上是关于QTreeView 的 QAbstractItemModel:我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何向qtreeview 自定义model 添加新行

QTreeView - 排序和过滤模型

QTreeView 的 QAbstractItemModel:我做错了啥?

自定义 QTreeView 项目

如何删除 QTreeView 左侧的空白区域

获取 QTreeView 中当前选中的项目