底下是參考 Using Drag and Drop with Item Views 章節
以往在 List, Tree, Table 元件中的拖拉, 除非其 GUI Framework有提供"幫你做到好"的服務, 否則並不是一個簡單的任務
而在 QT 當中, 雖不是很簡單到不用寫程式, 但其用 override function的方式, 讓我們去覆載"拖拉"的事件, 去完成我們的自己拖拉實作函式, 相信這種作法對 OOP 而言不但是直覺而且是富有彈性的方式, 而且通常我們在拖拉的過程中, 多半會去做一些動作, 如存取資料庫等等。
最近在一個專案中, 便繼承了 QTreeWidget 及 QTableWidget , 去實作拖拉函式, 而只要是繼承自 QAbstractItemView的類別都有支援 drag-and-drop, 其實也不用懂得太多, 只要覆載以下這個函式就可以了
QDragEnterEvent 拖拉物件進入可以置放的地方時...
QDragMoveEvent 拖拉物件移動時...
QDropEvent 放下拖拉的物件...
像我就在這些事件中處理一些事情, 以及把使用者拖拉的結果存到資料庫...
另外一些元件的屬性也要設定
如QT說明文件中的範例
QListWidget *listWidget = new QListWidget(this);
listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
listWidget->setDragEnabled(true);
listWidget->viewport()->setAcceptDrops(true);
listWidget->setDropIndicatorShown(true);
listWidget->setDragDropMode(QAbstractItemView::InternalMove);
當然, 如果你不需要捕抓"拖拉事件", 直接在 QT Designer中按一按就可以了!!!!
接下來還有一些更進階的拖拖拉拉...要學習...