http://yamcot.com/qt-drag-drop-event.htmlQt控制項拖拽事件By
flyingpig on 2010/06/06 699 Views | Go to Comments (1)
因為編輯器需要在不同的控制項之間支援拖拽操作,所以對Qt的拖拽研究了一下.
這裡實現一種比較簡單的拖拽方案
1.拖拽方控制項
拖拽需要支援拖拽的控制項開啟拖拽功能,調用函數
view source
print?
2 |
setDragDropMode(QAbstractItemView::DragOnly); |
其中拖拽模式可查具體的API, 這裡設定此空間之支援向外拖拽功能(即只能從此控制項向別的控制項拖拽操作,而不支援別的控制項向此控制項拖拽)
然後需要複寫startDrag(Qt::DropActions supportedActions)函數來執行開始拖拽時的一些操作.
view source
print?
01 |
void DragedListWidget::startDrag(Qt::DropActions supportedActions) |
03 |
QListWidgetItem *item = currentItem(); |
05 |
QMimeData *mimeData = new QMimeData; |
06 |
mimeData->setText(currentItem()->text()); |
08 |
mimeData->setProperty("TYPE", QVariant("MODELS")); |
09 |
mimeData->setProperty("MODEL_TYPE", QVariant(mType.c_str())); |
11 |
QDrag *drag = new QDrag(this); |
12 |
drag->setMimeData(mimeData); |
13 |
drag->exec(Qt::MoveAction); |
這裡QListWidget支援向外拖拽的功能,其中QMimeData用來再拖拽控制項和接受拖拽控制項間傳輸資料,這裡我把QListWidgetItem的常值內容作為傳輸內容發送.並設定了一些限定的屬性操作setProperty(這樣接受拖拽的控制項就可以只接受此控制項拖拽來的內容了)構造QDrag對象,並執行拖拽操作.
2.接受拖拽方控制項
有幾個函數需要複寫.
//當拖拽後進入接收拖拽的控制項時觸發
1.dragEnterEvent(QDragEnterEvent *event)
//當拖拽(沒有釋放滑鼠時)離開接收拖拽的控制項時觸發
2.dragLeaveEvent(QDragLeaveEvent *event)
//拖拽狀態下在接收拖拽的控制項內移動滑鼠時觸發
3.dragMoveEvent(QDragMoveEvent *event)
//拖拽狀態下釋放滑鼠時觸發
4.dropEvent(QDropEvent *event)
這裡主要針對dragEnterEvent來說明
view source
print?
01 |
void OgreWidget::dragEnterEvent(QDragEnterEvent *event) |
04 |
const QMimeData *data = event->mimeData(); |
05 |
QVariant type = data->property("TYPE"); |
06 |
if (!mKeyDown && type == QVariant("MODELS")) |
08 |
QVariant type = data->property("MODEL_TYPE"); |
首先從傳入的QDragEnterEvent 擷取接收到的QMimiData,之後判斷這次拖拽是否是需要的拖拽操作, 如果是則event->accept();表明接收此次拖拽事件, 如果不是則調用event->ignore(); 丟棄此次拖拽操作.
只有調用event->accept();之後dragLeaveEvent(QDragLeaveEvent *event), dragMoveEvent(QDragMoveEvent *event), dropEvent(QDropEvent *event)才會在之後觸發, 如果是event->ignore(); 則均不觸發.
Related posts
- 畢業設計
- TankWar V0.1 Published
- Qt中文亂碼解決方案
- Tank War
- TankWar系列(一) 基本架構
- TankWar 0.2.1
- OIS CEGUI更改視窗大小解決辦法