Python 将QAbstractTableModel与QTreeView一起使用时崩溃

Python 将QAbstractTableModel与QTreeView一起使用时崩溃,python,qt,pyqt,Python,Qt,Pyqt,由于似乎没有专门为QTreeView“设计”的“专用”抽象模型(对于QListView有QAbstractListModel,对于QTableView有QAbstractTableModel)由于我需要能够显示标题,所以我选择使用表的抽象模型:QAbstractTableModel和“QTreeView”。代码运行正常,但如果单击加号,它将立即崩溃。不应该与'QTreeView'一起使用QAbstractTableModel?使用什么抽象模型 import os,sys from PyQt4 i

由于似乎没有专门为QTreeView“设计”的“专用”抽象模型(对于
QListView
QAbstractListModel
,对于QTableView有
QAbstractTableModel
)由于我需要能够显示标题,所以我选择使用表的抽象模型:
QAbstractTableModel
和“QTreeView”。代码运行正常,但如果单击加号,它将立即崩溃。不应该与'QTreeView'一起使用
QAbstractTableModel
?使用什么抽象模型

import os,sys
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv)
elements={'Animals':{1:'Bison',2:'Panther',3:'Elephant'},'Birds':{1:'Duck',2:'Hawk',3:'Pigeon'},'Fish':{1:'Shark',2:'Salmon',3:'Piranha'}}

class Model(QtCore.QAbstractTableModel):
    def __init__(self):
        QtCore.QAbstractListModel.__init__(self)
        self.items=[] 
        self.modelDict={}
    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self.items)   
    def columnCount(self, index=QtCore.QModelIndex()):
        return 3
    def data(self, index, role):
        if not index.isValid() or not (0<=index.row()<len(self.items)): return QtCore.QVariant()
        if role==QtCore.Qt.DisplayRole:          return QtCore.QVariant(self.items[index.row()])
    def buildItems(self):
        totalItems=self.rowCount()
        for key in self.modelDict:    
            self.beginInsertRows(QtCore.QModelIndex(), totalItems+1, 0)
            self.items.append(key)
            self.endInsertRows()

class TreeView(QtGui.QTreeView):
    def __init__(self):
        super(TreeView, self).__init__()
        self.model= Model()
        self.model.modelDict=elements
        self.model.buildItems()
        self.setModel(self.model)
        self.show()       

window=TreeView()
sys.exit(app.exec_())

导入操作系统,系统 从PyQt4导入QtCore、QtGui app=QtGui.QApplication(sys.argv) 元素={'Animals':{1:'Bison',2:'Panther',3:'Elephant',Birds':{1:'Duck',2:'Hawk',3:'鸽子'},'Fish':{1:'Shark',2:'Salmon',3:'Piranha'} 类模型(QtCore.QAbstractTableModel): 定义初始化(自): QtCore.QAbstractListModel.\uuuuu init\uuuuuu(self) self.items=[] self.modelDict={} def行数(self,parent=QtCore.QModelIndex()): 返回len(自我项目) def columnCount(self,index=QtCore.QModelIndex()): 返回3 def数据(自身、索引、角色):
如果不是index.isValid()(0您就不能将
QAbstractTableModel
正确地用于
QTreeView
,因为该类仅用于
QTableView
。您必须继承(这是
QAbstractTableModel
QAbstractTableModel
继承的内容),并实现
index(),
parent()
rowCount()
columnCount()
data()
,如Qt的精细手册部分所述。对于
QTreeView
parent()
特别需要注意,因为它告诉
QTreeView
一个项目是否在顶层,或者它是否是树中另一个项目的子项


我相信Qt中没有
QAbstractTreeModel
类的主要动机是因为您需要重写所有这些方法来创建一个正确的表达树模型。

我想我还是坚持使用QTableView。谢谢您的解释!谢谢,我编辑了我的答案。即使我得到了n,至少我得到了正确的链接类的名称错误:)@JeffreyPfau我认为说“您不能将
QAbstractTableModel
正确地用于
QTreeView
,因为该类仅用于
QTableView
”是不对的。例如,在qt教程中,在讨论了一个
QAbstractTableModel
之后,说“您可以将上面的示例转换为具有树视图的应用程序。只需将QTableView替换为QTreeView,这将生成一个读/写树。无需对模型进行任何更改。”,文档支持视图可以显示不同类型的模型的说法。把我的最后一句话变成了疑问:@neuronet很奇怪,那篇教程说,因为清楚地说“由于[QAbstractTableView]模型提供了比QAbstractItemModel更专业的接口,它不适合用于树视图”