2016-07-06 69 views
2

我有QTreeViewQAbstractItemModel的子類,目前我正在使用拖放操作將項目從一個父索引移動到另一個父索引。我還想添加重新排列同一父索引內項目順序的功能。當用戶在兩個其他項目之間放置一個項目時,我需要確定是否應該放入或放入它們之間。我還想在鼠標移動時在兩個項目之間繪製一條黑線,以提示將會發生什麼,類似於許多其他樹型視圖(例如,大多數操作系統上的文件瀏覽器),如附圖所示:QTreeView - 如何判斷拖放事件是重新排序還是父母之間的移動?

拖動到現有項目:

drag into

插入之間現有的兩個項目:

drag in-between

不會自動Qt的拖累,這部分/拖放行爲,還是我必須手動計算相對於樹項目邊緣的鼠標位置?另外,如何在QTreeView中的兩個項目之間畫一條臨時線?

回答

1

我幾乎做同樣的事情,前一段時間,我能想到的3兩件事:

這是我正在做的一個非常簡單的例子。

dragMoveEvent()中,我顯示了跌落指標。這樣,當您拖動對象時,您將始終顯示拖放指示器。

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

dropEvent(),我是管理各種情況下,這是說,如果我是拖動項目是另一個項目,它上方,下方,或視口。然後,據我所知,我正在管理自己的下落,在事件結束時,我隱藏了下降指示器。

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訪問下降指標在你自己的風格。 你可以看到如何定製它herehere

+0

這完美的作品。 – Carlton

相關問題