QT的Model/View結構為我們實現各種界面提供了很大的靈活性,同時也比較方便。在這個框架中也支持Drag and Drop的操作,需要實現QAbstractItemModel類的幾個虛函數就可以,在QT文檔的”Using Drag and Drop with Item Views“中有介紹,但似乎看起來不夠明確,我根據自己的實際經驗總結一下記錄於此。
首先要給對應的View設置dragDropMode屬性,根據實際情況可以是DragOnly, DropOnly, DragDrop, InternalMove幾種,如果沒有設置是無法實現DragDrop操作的。其次就是對相應的數據模型類(QAbstractItemModel繼承類)實現相關的虛函數即可。
Drag and Drop操作實際上分兩步,兩步是單獨實現的。
一、Drag操作需要實現的方法:
1. 在flags函數中, 對允許執行Drag操作的項(item),需要返回 Qt::ItemIsDragEnabled屬性,這樣這些項目才可以被執行Drag操作;
2. 需要實現mimeData方法,將所執行Drag操作的數據打包,封裝為一個數據對象(QMimeData)。這個對象由接收Drop操作的對象使用。
二、Drop對象需要實現的方法:
1. 同樣在flags函數中,對允許執行Drop操作的項,需要返回Qt::ItemIsDropEnabled屬性。
2. 需要實現mimeTypes函數,這個函數要返回當前數據模型允許接收的數據類型列表,它會在Drag操作過程中被調用,如果Drag操作所包含的對象(第一部分中mimeData方法返回的數據對象)沒有相關類型的數據,就不允許執行Drop操作。
3. 實現dropMimeData方法。這個方法主要在drop操作後解析數據並添加到當前模型的合適位置。
按照上述的方法就可以實現基本的Drag and Drop操作,當然還有其他一些更高級的功能,像dropActions,dragActions等等,就由您自己去探索發現吧。