【发布时间】:2015-09-15 13:19:11
【问题描述】:
我的 TreeView 有各种带有孩子的文件夹。每个孩子都有一个图标和文本名称。用户可以选择一个或多个项目并将它们拖到 QMDI 区域中。作为我的 darg drop 的图像,我有一个本地图片拖动-> setPixmap(QPixmap(myPixImage))。我需要的是:我如何动态地将带有图标和文本的选定项目作为 myPixImage。
【问题讨论】:
标签: c++ qt drag-and-drop
我的 TreeView 有各种带有孩子的文件夹。每个孩子都有一个图标和文本名称。用户可以选择一个或多个项目并将它们拖到 QMDI 区域中。作为我的 darg drop 的图像,我有一个本地图片拖动-> setPixmap(QPixmap(myPixImage))。我需要的是:我如何动态地将带有图标和文本的选定项目作为 myPixImage。
【问题讨论】:
标签: c++ qt drag-and-drop
当您自己的代码创建 QDrag 对象时,设置像素图很容易,但是使用 QXxxViews(不仅是 QTreeView),您只能控制 QMimeData(当覆盖 QAbstractItemModel::mimeData() 时)。
因此,如果您真的需要它,我现在唯一的方法是继承 QTreeView,覆盖(嗯...重新实现)mouseMoveEvent() 等。 如果这样做,您可以在创建 QDrag 时通过例如selectionModel()->selectedItems().
【讨论】:
首先:没有简单的方法可以做到这一点。基本上是因为QDrag::exec 是在您(作为开发人员)允许开始拖动时启动的(例如here),并且在拖动完成之前它不会返回。
您想在拖动时更改您的QDrag 对象。
您最好的选择是:
Drag对象和之前运行QDrag::exec将对象存储在可以在代码中的任何位置访问的某个池中。可能类似于static map<QDrag *> pool
QTimer事件,不断更新QDrag对象,该对象可以从池中获取。请不要尝试使用Qthreads,因为您最终会遇到一些“QObject can't be move from/to thread”错误。请注意,您必须在视觉上相应地调整 QTimer 重复事件。
【讨论】: