2011-10-12 89 views
4

我开始拖放图像。Qt拖放 - 拖动时更改图像显示

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

回答

5

根据Qt's documentation,一旦拖动开始,就不能更改像素图。

Qt使用:

  • 其跟随鼠标上X11无框窗。像素图被绘制在小部件上,并且setGrabMouse用于接收鼠标事件,因为小部件不直接在鼠标下。
  • 功能SetCursor在Windows,与一个pixmap的副本,其中每个动作的光标已被涂在角落里。
  • 功能SetDragImageWithCGImage在Mac,但需要被声明为qdnd_mac.mm无法访问的局部变量DragRef对象。

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

+0

感谢您的信息。 –

+0

@Kong我添加了一些关于可能的解决方法的信息。 – alexisdm

0

从QDrag文档:

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

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

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