Python 是什么触发QTreeView在qabstractemmodel.data()函数中请求SizeIntrole

Python 是什么触发QTreeView在qabstractemmodel.data()函数中请求SizeIntrole,python,pyqt,qtreeview,qabstractitemmodel,Python,Pyqt,Qtreeview,Qabstractitemmodel,我使用TreeViews和AbstractItemModels开发了一些不同的应用程序,但是我遇到了一些我不理解的东西。我意识到视图正在调用模型的数据函数,要求为项目设置大小,因为角色是SizeIntrole()。在所有其他情况下,我不记得需要为数据函数返回大小。在下面的代码中,我错误地认为数据只会查找列表中的项目,如果取消对第一行的注释,视图将不显示任何内容,因为实际上视图要求索引的sizeHint 我的问题是,什么情况需要这样做?我以前从未需要提供sizeHint,我不知道什么时候需要,什么

我使用
TreeViews
AbstractItemModels
开发了一些不同的应用程序,但是我遇到了一些我不理解的东西。我意识到视图正在调用模型的
数据
函数,要求为项目设置
大小
,因为角色是SizeIntrole()。在所有其他情况下,我不记得需要为
数据
函数返回
大小
。在下面的代码中,我错误地认为
数据
只会查找列表中的项目,如果取消对第一行的注释,视图将不显示任何内容,因为实际上视图要求索引的
sizeHint

我的问题是,什么情况需要这样做?我以前从未需要提供
sizeHint
,我不知道什么时候需要,什么时候不需要

注释第一行时的窗口

窗口,从而忽略sizeHint请求

导入系统 从PyQt5导入QtCore、QtWidgets 类树列表: 定义初始化(自): self.\u items=list() 类树模型(QtCore.qabstractemodel): def uuu init uuuu(self、root、parent=None): super()。\uuuu init\uuuu(父级) self.root=根 def索引(self,row:int,column:int,parent:QtCore.QModelIndex=…)->QtCore.QModelIndex: 如果不是self.hasIndex(行、列、父项): 返回QtCore.QModelIndex() 如果不是parent.isValid(): 指针=self.root#类型:树列表 子项=指针。\u项[行] 其他: child=无 返回self.createIndex(行、列、子级) def附加项(自身,层): 行=列(self.root.\u项) self.beginInsertRows(QtCore.QModelIndex(),行,行) self.root.\u items.append(层) self.endInsertRows() def父级(自身,子级:QtCore.QModelIndex)->QtCore.QModelIndex: 返回QtCore.QModelIndex() def行数(self,父:QtCore.QModelIndex=…)->int: 如果parent.isValid(): 返回0 其他: 返回len(self.root.\u项目) def columnCount(self,parent:QtCore.QModelIndex=…)->int: 返回1 def hasChildren(self,parent:QtCore.QModelIndex=…)->bool: 如果parent.isValid()为True,则返回False,否则返回True def数据(self,索引:QtCore.QModelIndex,角色:int=…): #返回self.root.\u项[index.row()] 如果角色==QtCore.Qt.SizeHintRole: 打印(index.isValid()、index.row()、index.column()) 返回QtCore.QSize(100,20) 其他: 返回self.root.\u项[index.row()] def标志(self,索引:QtCore.QModelIndex): 返回QtCore.Qt.ItemIsEnabled | QtCore.Qt.itemisselect 类StackTreeView(QtWidgets.QTreeView): 定义初始化(self,data=None,parent=None): super()。\uuuu init\uuuu(父级) self.setModel(树模型(数据)) def附加项(自身,层): self.model().addItem(层) def test(): app=qtwidts.QApplication(sys.argv) 数据=树列表() 数据。_items=['1','2'] sys.excepthook=sys.\u excepthook__ 树视图=堆栈树视图(数据) 树视图。显示() 树状视图。附加项(“三”) 树状视图。附加项('4') sys.exit(app.exec_()) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 测试()
对于所有角色,默认情况下返回
self.root.\u items[index.row()]
毫无意义。您应该始终显式地检查角色,并且只返回适合该特定角色的值。如果没有特定于角色的数据,则应在PyQt中返回
None
(这相当于C++中的无效
QVariant

有关基本要求的概述,请参见