Qt Drag and Drop - 拖动时更改图像显示

Posted

技术标签:

【中文标题】Qt Drag and Drop - 拖动时更改图像显示【英文标题】:Qt Drag and Drop - Change image display while dragging 【发布时间】:2011-12-05 23:29:24 【问题描述】:

我开始用图像拖动。

QDrag* drag = new(QDrag)(this);
drag->setPixmap(*pixmap);
drag->exec(Qt::CopyAction | Qt::MoveAction);

我想在拖动到小部件中的某个点时更改图像显示。

目前我有一个想法。在我开始第一次拖动后,当我的拖动达到某个点时,我取消第一次拖动,然后使用新图像重新开始新的拖动。

我在dragMoveEvent 中执行此操作。我可以使用新图像开始新的拖动。但我似乎无法取消第一次拖动。我发现之前的拖拽动作还在执行中。

任何人都可以建议:

if (event->mimeData()->hasText())

  if (need_to_change_pixmap())
  
    event->setDropAction(Qt::IgnoreAction);
    change_pixmap_restart_drag();
  
  else
  
    event->setDropAction(Qt::MoveAction);
    event->accept();
  

else

  event->ignore();

change_pixmap_restart_drag 函数只是开始拖动。

【问题讨论】:

【参考方案1】:

根据Qt's documentation,一旦开始拖动,您将无法更改像素图。

Qt 使用:

一个跟随鼠标X11的无框窗口。像素图绘制在小部件上,setGrabMouse 用于接收鼠标事件,因为小部件不在鼠标的正下方。 函数SetCursor在 Windows 上,带有像素图的副本,其中每个操作的光标已绘制在角落。 函数SetDragImageWithCGImage在Mac上,但需要一个DragRef对象,该对象在qdnd_mac.mm中声明为不可访问的局部变量。

您可以尝试在所有平台上使用 X11 方法,或者如果您只打算在 Windows 上部署应用程序,则使用 SetCursor

【讨论】:

【参考方案2】:

来自 QDrag 文档:

void QDrag::setPixmap ( const QPixmap & pixmap ) :

pixmap设置为pixmap,用于表示拖放操作中的数据。只能在拖动开始前设置pixmap

所以,我很抱歉,但你不能! 连setDragCursor()都是没有效果的方法……

【讨论】:

以上是关于Qt Drag and Drop - 拖动时更改图像显示的主要内容,如果未能解决你的问题,请参考以下文章

Qt Drag & Drop:添加对拖动文件到应用程序主窗口的支持

拖放 Drag and drop

python selenium drag_and_drop()和drag_and_drop_with_offset()怎么使用?

虚幻引擎UE4如何制作可拖动(Drag and Drop)的背包(Scrollbox)

html新特性——拖拽(drag和drop)

重点突破——Drag&Drop拖动与释放