用于QTreeView的QAbstractItemModel:我做错了什么?

用于QTreeView的QAbstractItemModel:我做错了什么?

问题描述:

我想创建一个子类QAbstractItemModel以在QTreeView中使用它。起初,我决定制作一个没有任何层次支持的简约模型。它应该提供一个2×3的表格和简单的文本数据(只读一个)。用于QTreeView的QAbstractItemModel:我做错了什么?

唉,它不会崩溃,但不会显示任何数据:只有少数列标题(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_()) 
+0

你为什么从'index'方法返回'parent.internalPointer()''如果指数parent'是有效? – Dmitry

+0

那么,我只是试图修改这个''parent'有效时返回'QtCore.QModelndex()'。没有变化,所需的细胞不会出现... – Felix

+0

还有第二个错误,请参阅我的答案。 – Dmitry

两个错误:

  1. 你不应该从index方法返回parent.internalPointer() - 这种方法不返回模型的存储值,是指只返回索引模型项目
  2. data方法中,您为所有角色返回QtCore.QVariant("Oy vey!")。你真的应该只返回此为QtCore.Qt.DisplayRole,其他角色就OK返回None

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

谢谢同志们!而已! //Добратебе,умныйчеловек!^_^ – Felix

+0

另外,你不能看看这个吗? http://stackoverflow.com/questions/42565139/qabstractitemmodel-annoying-branch-line-in-qtreeview – Felix

+0

UPD:已经修复,tree.siblings()只给了一个节点的兄弟姐妹(节点本身没有列出) 。 – Felix