2016-07-06 3 views
2

서브 클래스가 QTreeView이고 QAbstractItemModel이고 현재 드래그 - 드롭을 사용하여 하나의 부모 색인에서 다른 색인으로 항목을 이동시키고 있습니다. 같은 부모 색인 내의 항목 순서를 재 배열하는 기능을 추가하고 싶습니다. 사용자가 두 개의 다른 항목 사이에 항목을 놓을 때 드롭을 삽입할지 또는 그 사이에 삽입 할지를 결정해야합니다. 첨부 된 그림에서와 같이 마우스가 움직일 때 두 항목 사이에 어두운 선을 그려야 할 것입니다. 힌트는 다른 트리 형식보기 (예 : 대부분의 운영 체제에서 파일 탐색기)와 유사합니다. 기존 항목에QTreeView - 드래그/드롭 이벤트가 부모 간의 순서 변경 또는 이동인지 여부를 나타내는 방법은 무엇입니까?

드래그 :

drag into

삽입 둘 사이의 기존 항목 :

drag in-between

합니까 Qt는가/드래그의이 부분을 자동화 드롭 동작을 사용하거나 트리 항목의 가장자리를 기준으로 마우스 위치를 수동으로 계산해야합니까? 또한 QTreeView의 두 항목 사이에 임시 줄을 어떻게 그릴 수 있습니까?

답변

1

내가 몇 시간 전에 거의 같은 일을했다, 나는 3 가지 생각할 수 있습니다 : 당신의 dropEvent()을 다시 구현할

다음은 내가 수행 한 작업의 매우 간단한 예입니다.

dragMoveEvent()에는 드롭 인디케이터가 표시되었습니다. 이렇게하면 개체를 끌 때 항상 드롭 표시기가 표시됩니다. dropEvent()에서

void MyTreeView::dragMoveEvent(QDragMoveEvent* event) 
{ 
    setDropIndicatorShown(true); 
    QTreeView::dragMoveEvent(event); 
} 

, 나는 각각의 경우를 관리하고, 그게 내가 드래그 된 항목이 그 아래 또는 뷰포트에, 그 위에, 다른 항목에 있었다면 말을합니다. 그런 다음, 그것에 따라, 나는 내 자신의 드롭을 관리하고 있었고, 이벤트가 끝날 때, 나는 드롭 인디케이터를 숨겼다.

void MyTreeView::dropEvent(QDropEvent* event) 
{ 
    bool dropOK = false; 
    DropIndicatorPosition dropIndicator = dropIndicatorPosition(); 

    switch (dropIndicator) 
    { 
    case QAbstractItemView::AboveItem: 
     dropOK = true; 
     break; 
    case QAbstractItemView::BelowItem: 
     dropOK = true; 
     break; 
    case QAbstractItemView::OnItem: 
     dropOK = false; 
     break; 
    case QAbstractItemView::OnViewport: 
     dropOK = false; 
     break; 
    } 
    if(dropOK) 
    { 
     // Here, you need to manage yourself the case of dropping an item 
    } 
    setDropIndicatorShown(false); // hide the drop indicator once the drop is done 
} 


"보너스" : 당신이 PrimitiveElementPE_IndicatorItemViewItemDrop하여 자신 만의 스타일에 드롭 인디케이터 (indicator)에 액세스 할 수 있습니다. herehere을 사용자 정의하는 방법을 볼 수 있습니다.

+0

완벽하게 작동합니다. – Carlton