2012-09-05 5 views
2

나는 여러 최상위 위젯을 가진 Qt Desktop 애플리케이션을 보유하고 있습니다. 최상위 위젯의 하위 위젯은 드래그 앤 드롭 방식을 사용하여 최상위 위젯간에 이동할 수 있습니다.소스 애플리케이션 위젯 외부로 드래그 앤 드롭 위젯

지금 문제는 기존의 최상위 위젯 외부에 하위 위젯을 놓고이 상위 위젯을 포함하는 새로운 최상위 위젯을 만드는 것입니다. 이 분리라고 부를 수 있습니다.

드래그 앤 드롭을 사용하여이 작업을 수행 할 수 있습니까? 내 dropEvent가가는 길을 찾을 수 없습니까? 드롭 장소가 허용되지 않는 경우에도 응용 프로그램에서 드롭 이벤트를 처리 할 수 ​​있습니까? 어쩌면 쥐 릴리스라도 될까요?

나는 지금 모든 것을 바꿀 수는 없지만 미래를위한 질문을 바꿀 수는 있습니다. 도킹/도킹 해제가 더 좋은 방법입니까?

감사 미하이

답변

1

나는이 작업을 수행 할 수있는 방법을 발견했다. 애플리케이션 위젯 외부로 드래그하면 QDrag 객체는 0 매개 변수로 targetChanged 신호를 내 보냅니다.

그래서 QDrag에서 상속 된 다음 target()이 null 인 경우 소멸자에서 사용자 지정 신호를 내 보냅니다.

다음

은 다음과 같습니다

유일한 문제는 커서가 드롭의 금지처럼 보이는 QDrag 만 이동 또는 복사 또는 링크와 같은 올바른 행동에 대한 커서 픽스맵을 설정할 수 있기 때문에 내가 고칠 수없는이

이 업데이트이다 상속 된 클래스

class TabDrag: public QDrag 
{ 
    Q_OBJECT 
public: 
    explicit TabDrag(QWidget *dragSource); 
    ~TabDrag(); 

signals: 
    void tearOff(); /// emit tearOff signal if the QDrag object is destroyed and target was null 
}; 

TabDrag::TabDrag(QWidget *dragSource):QDrag(dragSource) 
{ 
} 

TabDrag::~TabDrag() 
{ 
    // check if we need to detach this tab 
    if(!target()) 
    { 
     emit tearOff(); 
    } 
} 

tearOff 신호는 원하는대로 연결해야합니다. 내 경우에는 탭에서 위젯을 꺼내 부모를 새 창으로 변경합니다. Qt5에 대한 같은 질문에 의하면 사용

void MyTabBar::mouseMoveEvent(QMouseEvent* event) 
{ 
.................. 
    TabDrag * drag = new TabDrag(this); 
    drag->setMimeData(mimeData); 
    drag->setPixmap(*m_tabPixmap.data()); 
    drag->setHotSpot(QPoint(m_dragStartPos.x() - tabAtRect.x(), m_dragStartPos.y() - tabAtRect.y())); 
    drag->exec(); 

    QnConnect(drag, SIGNAL(tearOff()), this, SLOT(onTearOff())); 
} 
+1

예와이 영리한 대답을 찾을 수 있습니다. 그러나 targetChanged 신호를 연결하는 대상은 무엇입니까? 어떤 위젯이이 통지를 받습니까? 다시 사용자 정의 Drag 객체 자체에 연결합니까? 또는 드래그를 만든 소스 위젯에 exec를 호출 했습니까? 또한, targetChanged 슬롯에서 dragobj.setDragCursor (사용자 정의 커서 pixmap)를 호출 할 수 있습니까? 감사. 우우, 또! Drag :: exec()에 대한 Qt5 문서는 "Windows에서 Qt 이벤트 루프는 작업 중에 차단됩니다."라고 표시됩니다. 신호가 없습니까? – user405

+0

exec를 처음 사용하는 것은 결코 좋은 생각이 아닙니다. 아마도 당신을 충돌로 이끌 수있는 이벤트 반전을 생성 할 수있는 하위 이벤트 루프를 생성하기 때문입니다. 서브 이벤트 루프에서는 Qt가 그렇게 좋지 않습니다. 사용하지 마십시오. 약간의 모달 팝업 때문에 경험 한 충돌에서 말하기 – mhstnsc

+0

일부 코드를 포함하도록 답변을 업데이트했습니다. – mhstnsc