由于它似乎没有专门为QTreeView设计的“专用”抽象模型(对于QListView
有QAbstractListModel
,对于QTableView有QAbstractTableModel
),并且由于我需要能够显示我选择的标题使用Table的Abstract模型:QAbstractTableModel
和'QTreeView'。该代码可以正常运行,但是如果单击加号,则会立即崩溃。 QAbstractTableModel
不应与'QTreeView'一起使用吗?使用什么抽象模型?
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_())
最佳答案
您不能将QAbstractTableModel
与QTreeView
一起正确使用,因为该类仅用于QTableView
。您必须改为继承QAbstractItemModel
(这是QAbstractTableModel
和QAbstractListModel
都继承),并实现index()
,parent()
,rowCount()
,columnCount()
和data()
,如Qt精美手册的subclassing部分。对于QTreeView
,要特别注意parent()
非常重要,因为它告诉QTreeView
一个项目是否在顶层,或者它是树中另一个项目的子级。
我相信在Qt中没有QAbstractTreeModel
类的主要动机是因为您将需要重写所有这些方法来创建适当表达的树模型。
关于python - 将QAbstractTableModel与QTreeView一起使用时崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25880629/