使用QAbstractTableModel与QTreeView时崩溃

时间:2014-09-17 00:51:09

标签: python qt pyqt

因为看起来没有为QTreeView“专门设计”“专用”抽象模型(QListViewQAbstractListModel而QTableView有QAbstractTableModel)因为我需要能够显示我选择使用Table的抽象模型的标题:QAbstractTableModel和'QTreeView'。代码运行正常,但如果点击加号,它会立即崩溃。不应该与{QTreeView'QAbstractTableModel一起使用?使用什么抽象模型?

enter image description here

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_())

1 个答案:

答案 0 :(得分:2)

您无法QAbstractTableModel正确使用QTreeView,因为该类仅适用于QTableView。您必须继承QAbstractItemModel(这是QAbstractTableModelQAbstractListModel继承的内容),并实施index()parent()rowCount(),{ {1}}和columnCount(),如Qt精细手册的subclassing部分所述。对于data(),具体的QTreeView非常重要,因为它告诉parent()项目是否位于顶层,或者是否是其他项目的子项树。

我认为在Qt中没有QTreeView类的主要动机是因为你需要覆盖所有这些方法来创建一个正确表达的树模型。