【问题标题】:Qt Drag and Drop - Change image display while draggingQt Drag and Drop - 拖动时更改图像显示
【发布时间】: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 函数只是开始拖动。

【问题讨论】:

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


    【解决方案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()都是没有效果的方法……

      【讨论】: