【问题标题】:Crashing when using QAbstractTableModel with QTreeView将 QAbstractTableModel 与 QTreeView 一起使用时崩溃
【发布时间】:2014-09-17 18:33:35
【问题描述】:

因为看起来没有专门为 QTreeView “设计”的“专用”抽象模型(对于 QListViewQAbstractListModel,对于 QTableView 有 QAbstractTableModel),因为我需要能够显示标题我选择使用 Table 的抽象模型: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_())

【问题讨论】:

    标签: python qt pyqt


    【解决方案1】:

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

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

    【讨论】:

    • 我想我会坚持使用 QTableView。谢谢解释!
    • 谢谢,我编辑了我的答案。我至少得到了正确的链接,即使我的班级名称错误:)
    • @JeffreyPfau 我认为说“您不能将QAbstractTableModelQTreeView 一起使用是不对的,因为该类仅适用于QTableView”。一方面,在 qt 教程中,在讨论了 QAbstractTableModel 之后,说“您可以将上面的示例转换为具有树视图的应用程序。只需将 QTableView 替换为 QTreeView,这会产生读/写树。无需更改制作模型。”也就是说,该文档支持视图可以显示不同类型的模型的说法。 qt-project.org/doc/qt-4.8/modelview.html#3-1-treeview.
    • 把我最后的评论变成了问题:stackoverflow.com/questions/27308309/…
    • @neuronet 奇怪的是那个教程说,因为manual 明确说“由于 [QAbstractTableView] 模型提供了比 QAbstractItemModel 更专业的接口,它不适合与树视图一起使用”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多