一、需求說明   

     最近在搞視圖項(xiàng)的拖拽,也上網(wǎng)查了一些資料,好多的文檔都是一樣的,只是被不通的網(wǎng)站所收錄了(也有可能是被爬過去的,不明所以),不過也有一些文檔寫的不錯,不過就是太簡易,都是點(diǎn)睛之筆,總之功能還是勉強(qiáng)可以實(shí)現(xiàn),加之比較零散,剛好我自己也因?yàn)檫@個需求寫了一個demo,因此我就把自己寫這個demo的過程分析給大家,希望能幫到有這個需求的小伙伴。

回到頂部

二、效果展示   

    如圖1是demo的效果展示,比較丑,如果加上優(yōu)秀的qss,那必然能讓人眼前一亮。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

圖1 ListWidget拖拽

回到頂部

三、實(shí)現(xiàn)思路

  1. 繼承QListWidget類,重寫其鼠標(biāo)多拽時幾個虛方法,分別是:dragEnterEvent(鼠標(biāo)拖拽進(jìn)入),dragLeaveEvent(鼠標(biāo)拖拽時離開),dragMoveEvent(拖拽時移動),dropEvent(鼠標(biāo)釋放),(mousePressEvent)鼠標(biāo)按下,mouseMoveEvent(鼠標(biāo)移動)等。

  2. 鼠標(biāo)按下時,記錄鼠標(biāo)按下位置和鼠標(biāo)點(diǎn)擊項(xiàng)    

  3. 鼠標(biāo)移動時構(gòu)造一個QDrag對象,并且執(zhí)行其exec方法,這個方法執(zhí)行后,直到dropEvent觸發(fā)后,mouseMoveEvent方法才會被再次觸發(fā),否則鼠標(biāo)移動消息一直派發(fā)給dragMouseEvent。exec方法的之后,后續(xù)的鼠標(biāo)事件都會在drag打頭的方法中回調(diào)。  

  4. 拖拽期間,鼠標(biāo)移動,并回調(diào)在dragMoveEvent方法中,可以在這個方法中修改鼠標(biāo)狀態(tài)。維護(hù)一些變量,比如效果圖上跟隨鼠標(biāo)一起移動的一張圖片和綠色的指示插入位置的一條線。

  5. 最后鼠標(biāo)釋放時,判斷如果需要更新拖拽項(xiàng)位置,那么把原有項(xiàng)刪除,并構(gòu)造新的項(xiàng)插入到目標(biāo)位置。

回到頂部

四、代碼說明

1、首先來看幾個關(guān)鍵的類
    MimeData:存儲拖拽時數(shù)據(jù)
    ListItem:item項(xiàng)定制,展示自定義結(jié)構(gòu)
    DragList:視圖窗口
2、下面就直接上代碼,步驟對應(yīng)第三小節(jié)的思路

a、記錄鼠標(biāo)按下時信息

網(wǎng)友評論