由于它似乎没有专门为QTreeView设计的“专用”抽象模型(对于QListViewQAbstractListModel,对于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_())

最佳答案

您不能将QAbstractTableModelQTreeView一起正确使用,因为该类仅用于QTableView。您必须改为继承QAbstractItemModel(这是QAbstractTableModelQAbstractListModel都继承),并实现index()parent()rowCount()columnCount()data(),如Qt精美手册的subclassing部分。对于QTreeView,要特别注意parent()非常重要,因为它告诉QTreeView一个项目是否在顶层,或者它是树中另一个项目的子级。

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

关于python - 将QAbstractTableModel与QTreeView一起使用时崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25880629/

10-11 13:13