Qt Drag and Drop QTreeView

Qt Drag and Drop QTreeView

本文关键字:QTreeView Drop and Drag Qt      更新时间:2023-10-16

我的TreeView有不同的子文件夹。每个孩子都有一个图标和文本名称。用户可以选择一个或多个项目并将其拖动到QMDI区域。作为我的darg drop图像,我有一个本地图片拖拽->setPixmap(QPixmap(myPixImage)))。我需要的是:我如何使选中的项目与图标和文本作为myPixImage动态。

当您自己的代码创建QDrag对象时,很容易设置像素图,但是使用QXxxViews(不仅仅是QTreeView),您只能控制QMimeData(当重写QAbstractItemModel::mimeData()时)。

因此,如果你真的需要,我现在唯一的方法是子类化QTreeView,重写(嗯…重新实现)mouseMoveEvent()等。如果你这样做,你可以在创建QDrag时通过selectionModel()->selectedItems()获得选中的项目。

首先:没有简单的方法可以做到这一点。基本上是因为QDrag::exec是在你(作为开发人员)允许开始拖动时启动的(这里的例子),直到拖动完成它才返回。

当拖拽时,想要更改QDrag对象

你最好的选择是:

  1. 创建Drag对象之后,运行QDrag::exec之前将对象存储在可以在代码中的任何地方访问的池中。可能是static map<QDrag *> pool
  2. 设置一个循环QTimer事件,不断更新QDrag对象,可以从池中获取。做不是尝试使用Qthread s,因为你最终会遇到一些"QObject不能从/移动到线程"错误。
  3. 当拖动结束时(作为用户),从池中清除对象

请注意,您必须在视觉上相应地调整QTimer重复事件。