PyQt:人类语言中的QTreeView和QAbstractItemModel

时间:2014-02-24 23:13:59

标签: pyqt qtreeview qabstractitemmodel

虽然深入了解TreeView / Model概念,但到目前为止我“理解”了......

首先,我将 MyTreeView ()类子类化,然后通过将分配给 MyOwnAbstractItemModel ()模型扩展 QTreeView 内置(下一步的子类化):

class myTreeView(QTreeView):
    def __init__(self, parent=None):
        super(myTreeView, self).__init__(parent)
        self.myOwnAbstractModel = MyOwnAbstractItemModel()
        self.setModel(self.myOwnAbstractModel)

我继续子类化/描述 MyOwnAbstractItemModel ()。它使用内置的QAbstractItemModel()类作为“模板”开始......

class MyOwnAbstractItemModel(QAbstractItemModel):      
    def __init__(self, parent=None):
        super(MyOwnAbstractItemModel, self).__init__(parent)

根据我的理解,必须声明一些 MyOwnAbstractItemModel()方法才能使MODEL工作。 我想知道在哪里可以得到那些方法()名称及其语法描述的完整列表?

我查看了在线发布的代码示例。看来这些预定义的方法已经预先定义了特定的语法...例如传入参数的数量和预期的参数类型...例如下面的方法不会得到任何传入的参数(不清楚是什么它的目的):

def mimeTypes(self):
    #print '\n mimeTypes(self)'
    types = QStringList()
    types.append('application/x-ets-qt4-instance')
    return types

但是这个方法:

def dropMimeData(self, mimedata, action, row, column, parentIndex):
    parentNode = self.nodeFromIndex(parentIndex)

有四个参数。请指教!非常感谢提前。

2 个答案:

答案 0 :(得分:4)

如果您下载source code for PyQt,您将在contrib/pymodeltest目录中找到模型测试模块。此模块提供了一种检查自定义模型实现中常见错误的方法。您可能会发现查看此模块中的代码很有用,因为它有很多有用的注释,可以解释它执行的许多测试的目的。

另外,您应该仔细阅读Qt文档中的Model/View Programming overview - 特别是Model Subclassing reference

答案 1 :(得分:2)

Qt文档列出了在the docs中继承QAbstractItemModel所需的最小方法。

方法签名被设置为接受某些参数,因为这是与模型交互的类(例如视图)将调用它们的方式。您提供的几个示例与实现拖放功能有关。

使用树模型,您可能还希望在节点数据类中实现某些方法,以便树节点可以提供有关其自身,父节点和子节点的信息。你如何做到这一点取决于你。这些节点链接在一起形成树层次结构。

模型/视图的东西最初可能有点困难。我可能会建议您首先实现自己的树模型并使用标准QTreeView,然后从那里探索自定义视图并进行拖放。随PyQt源提供的simpletreemodel示例是一个很好的简单例子。它只实现了所需的方法(加上headerData),并且有一个简单的TreeItem类作为节点。