2011-10-12 92 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()是一種沒有影響的方法...