Qt控制項拖拽事件

來源:互聯網
上載者:User
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?

1 setDragEnabled(true);
2 setDragDropMode(QAbstractItemView::DragOnly);

    其中拖拽模式可查具體的API, 這裡設定此空間之支援向外拖拽功能(即只能從此控制項向別的控制項拖拽操作,而不支援別的控制項向此控制項拖拽)

    然後需要複寫startDrag(Qt::DropActions supportedActions)函數來執行開始拖拽時的一些操作.

view source



print?

01 void DragedListWidget::startDrag(Qt::DropActions supportedActions)
02 {
03   QListWidgetItem *item = currentItem();
04   
05   QMimeData *mimeData = new QMimeData;
06   mimeData->setText(currentItem()->text());
07   // 設定拖拽物體為模型
08   mimeData->setProperty("TYPE", QVariant("MODELS"));
09   mimeData->setProperty("MODEL_TYPE", QVariant(mType.c_str()));
10   
11   QDrag *drag = new QDrag(this);
12   drag->setMimeData(mimeData);
13   drag->exec(Qt::MoveAction);
14 }

 

 

    這裡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)
02 {
03   // 先查看拖拽到情境內的物體是否是模型
04   const QMimeData *data = event->mimeData();
05   QVariant type = data->property("TYPE");
06   if (!mKeyDown && type == QVariant("MODELS"))
07   {
08     QVariant type = data->property("MODEL_TYPE");
09                 //......
10     event->accept();
11   }
12   else
13     event->ignore();
14 }

    首先從傳入的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更改視窗大小解決辦法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.