2011-08-26 35 views
3

我使用拖放在QWidget上,我已經重新實現了dragEnterEvent,dragLeaveEvent,dragMoveEvent和dropEvent,並且運行良好。Qt:委託一個拖放到兒童的最佳方式

在我的QWidget中,我有其他QWidget子項,我希望它們也可以管理拖放操作。問題是我的父母QWidget趕上dnd事件,所以我的孩子不明白。什麼是最好的方式來說「當你超過一個孩子小部件,孩子得到dnd事件」?

感謝

編輯:

我的小部件看起來是這樣的:

---------------------------------------- 
|   Parent Widget    | 
|  ------------------    | 
|  | Child Widget |    | 
|  |    |    | 
|  ------------------    | 
|          | 
---------------------------------------- 

我父控件和子部件是同一類的。

的代碼是很基本的,它是與此類似:

DnDWidget::DnDWidget(QWidget* parent) 
    : QWidget(parent) 
{ 
    setAcceptDrops(true); 
} 

void DnDWidget::dragEnterEvent (QDragEnterEvent* event) 
{ 
    qDebug() << "dragEnterEvent"; 
    if (event->mimeData()->hasFormat("foo/bar")) 
     event->acceptProposedAction(); 
} 

void DnDWidget::dragMoveEvent (QDragMoveEvent* event) 
{ 
    qDebug() << "dragMoveEvent"; 
    //do visual feedback stuff 
} 

我孩子的dragEnterEvent永遠不會被調用。

回答

2

drag-and-drop documentation

爲了能夠接收媒體降至上的小工具,叫setAcceptDrops(true)窗口小部件,並重新實現dragEnterEvent()dropEvent()事件處理函數。

這裏的快速摘要:

  1. 孩子應該叫setAcceptDrops(true)
  2. 孩子應該重新實現dragEnterEvent並接受其提出的行動
  3. 孩子應該重新實現dropEvent並接受其proposed action

如果上述任何一個不是真的,那麼父母將有機會處理這個下降。

+0

我的孩子確實會調用這些方法。問題是它的父級捕獲事件,所以我的孩子的dragEnterEvent從不被調用。 到目前爲止,我認爲解決方案是通過QApplication :: sendEvent自己重新發送事件,但我想知道是否沒有更好的方法。 – robix

+0

孩子會先看到事件。確保您的函數簽名完全匹配,並且重新實現的方法正如預期的那樣由基類調用。 –

+0

是的,我的孩子班和我的父母班實際上是一樣的。我可以看到父母的DnD視覺反饋,並且我父母的dragEnterEvent和dragMoveEvent被調用,但是當我走到兒童QWidget的上方時,父母的dragLeaveEvent不會被調用,既不是我的孩子的dragEnterEvent。 – robix