【问题标题】: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()。没有任何变化,没有出现所需的单元格...
  • 还有第二个错误,看我的回答。

标签: qt model pyqt qabstractitemmodel


【解决方案1】:

两个错误:

  1. 您不应该从 index 方法返回 parent.internalPointer() - 此方法不返回模型的存储值,它只返回模型项的索引
  2. 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
    

【讨论】:

  • 谢谢同志!就是这样! // Добра тебе, умный человек! ^_^
  • 另外,你不能看看这个吗? stackoverflow.com/questions/42565139/…
  • UPD:已经修复,tree.siblings() 只给出了一个节点的兄弟姐妹(节点本身没有列出)。
猜你喜欢
  • 2011-09-29
  • 2016-07-20
  • 2011-06-01
  • 1970-01-01
  • 2021-04-14
  • 2021-04-19
  • 2017-03-13
  • 2017-01-18
  • 2013-06-24
相关资源
最近更新 更多