因为看起来没有为QTreeView“专门设计”“专用”抽象模型(QListView
有QAbstractListModel
而QTableView有QAbstractTableModel
)因为我需要能够显示我选择使用Table的抽象模型的标题: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_())
答案 0 :(得分:2)
您无法QAbstractTableModel
正确使用QTreeView
,因为该类仅适用于QTableView
。您必须继承QAbstractItemModel
(这是QAbstractTableModel
和QAbstractListModel
继承的内容),并实施index()
,parent()
,rowCount()
,{ {1}}和columnCount()
,如Qt精细手册的subclassing部分所述。对于data()
,具体的QTreeView
非常重要,因为它告诉parent()
项目是否位于顶层,或者是否是其他项目的子项树。
我认为在Qt中没有QTreeView
类的主要动机是因为你需要覆盖所有这些方法来创建一个正确表达的树模型。