Qt拖放QTreeView

时间:2015-09-15 13:19:12

标签: c++ qt drag-and-drop

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

2 个答案:

答案 0 :(得分:2)

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

因此,如果你真的需要它,我现在唯一的方法是继承QTreeView,覆盖(以及......重新简化)mouseMoveEvent()等。 如果这样做,您可以在创建QDrag时获取所选项目,例如: selectionModel的() - > selectedItems()

答案 1 :(得分:0)

首先:没有简单的方法可以做到这一点。基本上是因为当您(作为开发人员)允许开始拖动(例如QDrag::exec)时启动here,并且在拖动完成之前它不会返回。

您希望在拖动时更改QDrag对象

这里你最好的选择是:

  1. 创建Drag对象和之后运行QDrag::exec将对象存储在某个池中,该池可以在代码中的任何位置访问。可能类似于static map<QDrag *> pool
  2. 设置一个不断更新QTimer对象的循环QDrag事件,该对象可以从池中获取。 尝试使用Qthread,因为您最终会遇到一些“QObject无法从/移动到线程”错误。
  3. 当拖动结束时(作为用户),从池中清除对象
  4. 请注意,您必须相应地在视觉上调整QTimer重复事件。