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
)
有关基本要求的概述,请参见