【问题标题】:How to use QAbstractItemModel?如何使用 QAbstractItemModel?
【发布时间】:2012-05-02 06:56:24
【问题描述】:

我需要在 PyQt 中使用 QAbstractItemModel 和 QTreeView。

在 dropMimeData 方法中,我想删除源行(如果它是某个 MIME_TYPE。)如何获取源的行和 parentIndex?还是我需要通过其他方法做到这一点。

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

【问题讨论】:

  • 你确定 QTreeWidget 不够用了吗? QTreeView + QStandardItemModel 怎么样?您有什么需要子类化并创建自己的自定义模型?
  • @Tim:我认为您的编辑虽然是的,但它确实说明了问题的明确性,但确实显着改变了 OP 可能提出的问题。您发表评论并让 OP 调整该问题可能会更好。我更感兴趣的是听到他为什么需要一个抽象模型,而不是他关于 dropMimeData 的问题,我认为这实际上可能无关紧要。
  • @jdi 我还没有确定任何事情。我从我能找到的最接近我需要的东西开始。我需要一棵源项目树(现在只有一列名称)和另一棵我想删除这些项目的树。在目标树上,我需要将项目移动到不同的位置。我假设这将是一个内部拖放然后删除源项目。我使用子类模型只是为了有一种方法来判断项目来自哪棵树,所以我不会从源树中删除任何东西。
  • @jdi 我找不到像 internalMove 一样的 DragDropMode 并且还允许从另一个视图拖放。应该有一个更简单的方法来做到这一点,我会很感激学习它。其他人建议使用子类。
  • QAbstractItemModel 适用于您需要自定义类型的模型时,但仅用于进行拖放而不是必需的。你将不得不实施比你应该需要的更多。 QStandardItemModel 应该功能齐全并且可以与 QTreeView 一起使用。您只需将其中一个子类化,然后重新实现 dragEvent/dropEvent 方法。如果你想保留两个完全独立的模型,那么抛弃这整个混乱,只继承具有内置模型的 QTreeWidget。

标签: pyqt qtreeview qabstractitemmodel


【解决方案1】:

我的 cmets 运行时间过长,所以我想我现在应该用这些信息开始回答。

QAbstractItemModel 是一个基类,当您需要一种自定义的数据建模方式时,该基础类不适合现有的一种方式,例如从哪里获取数据以及如何将它们表示为项目。它还没有准备好开箱即用,因为它需要实现许多方法。除非您有令人信服的理由,否则您可能不应该从这门课开始,因为它需要更多的工作才能开始和运行。

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

使用 QStandardItemModel + QTreeView 可以让您拥有多个视图,它们都使用相同的模型并同时将其可视化。但是鉴于您说要保留两组不同的独立数据,并且您是 Qt 的新手,我强烈建议您只使用两个 QTreeWidget。 QTreeWidget 是视图和模型的包罗万象的包。这对你来说现在使用起来会容易得多。

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

这是一个关于使用 QTreeWidget 拖放的帖子的链接:http://www.qtcentre.org/threads/5910-QTreeWidget-Drag-and-drop
他们提到了推荐的实现方法,以及您应该如何使用 QTreeWidgetItem 的子类来定义 mimeData。

【讨论】:

  • “你总是可以重新实现 QWidget::mousePressEvent(QMouseEvent*) 并手动创建你自己的 QDrag 对象来指定拖动类型(移动或复制)。”这看起来像是我需要知道的事情之一。我最初的问题是我在哪里可以对这些类以及如何使用它们有一个基本的了解。对于 PyQt,看起来唯一的地方是类参考和在线示例(主要是 C++)和发布很多问题。似乎我从来没有遇到过为 Java 找到好的书籍和教程的麻烦。感谢您的帮助。
  • @hosscomp:除了语法之外,C++ API 的文档与 python 的文档几乎相同。好书:qtrac.eu/pyqtbook.html。只需阅读相当丰富的 C++ 文档即可。他们有一整节关于拖放
  • 谢谢。我认为那本书对我很有帮助。我今天才发现如何将 dragEnterEvent 处理程序添加到 TreeView 并检查 event.source() 是否为 self。
  • 我一直在阅读这本书并将dragMoveEvent 处理程序添加到我的QTreeView 子类中,如果source 是self,则将放置动作设置为Qt.MoveAction。它仍然移动而不是复制,并且仍然通过 dropMineData。但后来我在 Spider(而不是 Eclipse)中运行它,它按照我想要的方式工作。它也适用于 IDLE 和命令行。我不知道有什么区别。
  • @hosscomp:只是在不同的 IDE 下启动它有不同的行为?我只是猜测它可能与引用不同的解释器或不同的 Qt 版本有关?我通常只是从命令行启动我的。这是确定它是否真的工作正常的可靠测试。
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 2017-06-07
  • 2014-03-28
  • 2021-07-18
  • 2015-11-17
  • 1970-01-01
  • 2011-09-29
  • 2016-07-20
相关资源
最近更新 更多