Qt拖放 - 拖动时更改图像显示

时间:2011-10-12 09:26:24

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

我开始拖累图像。

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 功能只是开始拖动。

2 个答案:

答案 0 :(得分:6)

根据Qt's documentation,拖动开始后你无法改变像素图。

Qt使用:

  • 无框窗户,跟随X11 上的鼠标。 pixmap在小部件上绘制,setGrabMouse用于接收鼠标事件,因为小部件不是直接在鼠标下面。
  • Windows上的函数SetCursor ,其中包含像素图的副本,其中每个动作的游标都在角落里绘制。
  • Mac上的函数SetDragImageWithCGImage ,但需要一个DragRef对象,该对象在 qdnd_mac.mm 中被声明为无法访问的局部变量。< / LI>

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

答案 1 :(得分:0)

来自QDrag docs:

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

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

所以,我很抱歉,但你不能! 即使 setDragCursor() 也是一种没有效果的方法......