如何使用QAbstractItemModel?

问题描述:

我需要在QTreeView中使用QAbstractItemModel。如何使用QAbstractItemModel?

在dropMimeData方法中,我想删除源代码行(如果它是特定的MIME_TYPE)。如何获取源代码的行和parentIndex?或者我需要从其他方法做到这一点。太长

def dropMimeData(self, mimedata, action, row, column, parentIndex):

+0

你确定QTreeWidget不够吗?那QTreeView + QStandardItemModel呢?你需要什么,需要你继承和创建你自己的自定义模型? – jdi 2012-04-20 20:29:39

+0

@Tim:我认为你的编辑,虽然是的,但它提出了一个关于问题清晰度的观点,确实显着改变了OP可能提出的要求。你可能会更好地发表评论,并让OP调整这个问题。我更感兴趣的是,为什么他需要一个抽象模型,而不是他关于dropMimeData的问题,我认为这可能实际上是无关紧要的。 – jdi 2012-04-21 00:21:53

+0

@jdi我还没有确定任何东西。我从最接近我能找到的东西开始,看起来接近我需要的东西。我需要一棵树的源项目(现在是单列名称)和另一棵我想放下它的树。在目标树上,我需要将项目移动到不同的位置。我假设这将是一个内部拖放,然后删除源项目。我使用子类模型只是为了告诉哪些树来自哪些树,所以我不会从源树中删除任何东西。 – hosscomp 2012-04-23 17:33:18

我的评论被运行,所以我想我现在就开始回答与信息。

QAbstractItemModel是一个基类,当你需要一种不适合现有数据建模的定制方式时,例如在何处获取数据以及如何将它们表示为项目。它不能立即使用,因为它需要实施一些方法。除非你有充足的理由这样做,否则你不应该从这门课开始,因为它需要更多的工作来启动和运行。

只需要拖放和使用基本项目,QStandardItemModel应该准备好供您使用。您只需创建QStandardItems并填充模型。对于拖放,您可以对模型进行子类化,只需实施适当的拖放*事件并放置*事件方法以满足您的需求。

使用QStandardItemModel + QTreeView允许您使用相同的模型使所有视图都可以同时显示不同的视图。但鉴于你说你想保留两组不同的独立数据,并且你对Qt是新手,我强烈建议你只使用两个QTreeWidgets。 QTreeWidget是视图和模型的全面包装。这对你现在使用起来要容易得多。

使用QTreeWidget,您可以对它们进行子类化并实现必要的拖放事件,就像您对QTreeView的操作一样,但您不必再单独担心模型。

下面是关于其拖动到该帖子的链接,并与QTreeWidget下降:http://www.qtcentre.org/threads/5910-QTreeWidget-Drag-and-drop
他们提建议的方法来实现,也应该与QTreeWidgetItem的子类来定义mimeData做什么。

+0

“你总是可以重新实现QWidget :: mousePressEvent(QMouseEvent *)并创建你自己的指定拖动类型(移动或复制)的QDrag对象。” 这看起来像我需要知道的事情之一。我最初的问题是我在哪里寻求对这些类的基本了解以及如何使用它们。对于PyQt,它看起来像唯一的地方是类参考和在线示例(主要是C++)并发布了大量问题。似乎我从来没有找到好的书籍和Java教程的麻烦。谢谢你的帮助。 – hosscomp 2012-04-23 21:09:43

+0

@hosscomp:除了语法之外,C++ API的文档与python非常相似。好书:http://www.qtrac.eu/pyqtbook.html。它只是阅读相当丰富的C++文档。他们有关于拖放的整个部分 – jdi 2012-04-23 21:59:42

+0

谢谢。我认为这本书对我很有帮助。我今天才发现如何将dragEnterEvent处理程序添加到TreeView中,并检查event.source()是否是self。 – hosscomp 2012-04-26 20:08:28