2011-08-26 2 views
3

QWidget에서 드래그 앤 드롭을 사용하고 있습니다. dragEnterEvent, dragLeaveEvent, dragMoveEvent 및 dropEvent를 다시 구현했으며 제대로 작동합니다.Qt : 아이들에게 드래그 앤 드롭을 위임하는 가장 좋은 방법

내 QWidget에는 다른 QWidget 하위 항목이 있으므로 드래그 앤 드롭도 관리해야합니다. 문제는 부모님 QWidget이 dnd 이벤트를 잡아 내 아이들이 이해하지 못하기 때문입니다. "아이 위젯 위에있을 때, 아이가 dnd 이벤트를 얻는다"고 말하는 가장 좋은 방법은 무엇입니까?

내 위젯은 다음과 같습니다 :

편집

감사

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

내 부모 위젯과 자식 위젯은 같은 클래스의이다.

코드

은 아주 기본적인,이 비슷 : 내 아이의 dragEnterEvent가 호출되지 않습니다

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 
} 

. drag-and-drop documentation에서

답변

2

:

은, 미디어가 위젯에 떨어받는 위젯 setAcceptDrops(true)를 호출하고 dragEnterEvent()dropEvent() 이벤트 핸들러 기능을 구현할 수 있습니다.

  1. 아이가 setAcceptDrops(true)를 호출해야합니다 :

여기에 빠른 요약입니다.

  • 아이는 dragEnterEvent 다시 구현과 아이가 dropEvent 다시 구현하고 proposed action을 받아 들여야
  • 제안 된 행동 받아 들여야한다.
  • 위 항목 중 하나라도 해당 사항이 없으면 부모는 드롭을 처리 할 수 ​​있습니다.

    +0

    우리 아이는이 방법들을 호출합니다. 문제는 부모가 이벤트를 catch하므로 내 자식의 dragEnterEvent가 호출되지 않습니다. 지금까지 QApplication :: sendEvent를 통해 이벤트를 직접 다시 보내는 것이 해결책이라고 생각합니다. 그러나 더 좋은 방법이 없는지 궁금합니다. – robix

    +0

    아이가 먼저 이벤트를 보게됩니다. 함수 서명이 정확히 일치하고 다시 구현 된 메서드가 예상대로 기본 클래스에 의해 호출되는지 확인하십시오. –

    +0

    그렇습니다. 내 자식 클래스와 부모 클래스는 실제로 같습니다. 부모의 DnD 시각적 피드백을 볼 수 있으며 부모의 dragEnterEvent 및 dragMoveEvent가 호출됩니다. 그러나 자식 QWidget을 초과하면 부모의 dragLeaveEvent가 호출되지 않고 내 자식의 dragEnterEvent도 호출되지 않습니다. – robix

    관련 문제