2013-12-16 62 views
3

比方說,我們有以下層次:交換就拖QTreeView則項目和拖放操作

+ A 
|-- B 
    |-- D 
|-- C 

而且假設用戶拖動下向B.是否有可能有兩個節點(包括兒童)替換爲該拖放操作的結果?

+ A 
|-- C 
|-- B 
    |-- D 

我試過多種方法:從子類的項目模型(dropMimeDatainsertRows等),以調整模式與setDragDropOverwriteModeDragDropMode::InternalMove,以繼承dropEvent(QDropEvent * e)並沒有什麼至今工作。

我遇到以下趙彤限制:

  • QStandardItemModel::dropMimeDataQTreeview::dropEvent不會讓你知道源指標,他們向前MIME數據,而且也沒有辦法獲取源的QModelIndex執行交換。

  • DragDropMode::InternalMovesetDragDropOverwriteMode方法不按預期工作,源節點以某種方式被追加到放置目標節點,並且源節點被刪除。如果設置了DragDropMode::Copy,則會保留源節點,但目標節點也不會被覆蓋。

向正確的方向微調將不勝感激。

回答

4

我檢查了source code of Qt,事實證明,要獲取源索引,您應該使用當前選擇。因此,覆蓋QTreeview::dropEvent並通過調用selectedIndexes()獲取當前選擇。


交換不是問題。你必須做兩次移動。
有一種空間方法: QAbstractItemModel::moveRow(三個你只有一列,所以移動的行是好的)。 在這裏您有一個與 another solutions(標準項目模型)的答案。

如果您擁有自己的自定義模型,則必須直接對數據執行操作,並只發出關於移動項目的正確信號。

+1

This Works!雖然它沒有回答如何進行實際交換的問題。我一直在嘗試使用'QStandardItemModel :: takeItem',當你嘗試執行交換時,QModelIndex會被破壞。更不用說如何處理子節點。 – voodooattack

+0

這部分很容易看到更新。 –

+0

雖然這是Qt5。 – voodooattack