一、需求說明
最近在搞視圖項(xiàng)的拖拽,也上網(wǎng)查了一些資料,好多的文檔都是一樣的,只是被不通的網(wǎng)站所收錄了(也有可能是被爬過去的,不明所以),不過也有一些文檔寫的不錯(cuò),不過就是太簡(jiǎn)易,都是點(diǎn)睛之筆,總之功能還是勉強(qiáng)可以實(shí)現(xiàn),加之比較零散,剛好我自己也因?yàn)檫@個(gè)需求寫了一個(gè)demo,因此我就把自己寫這個(gè)demo的過程分析給大家,希望能幫到有這個(gè)需求的小伙伴。
二、效果展示
如圖1是demo的效果展示,比較丑,如果加上優(yōu)秀的qss,那必然能讓人眼前一亮。
圖1 ListWidget拖拽
三、實(shí)現(xiàn)思路
繼承QListWidget類,重寫其鼠標(biāo)多拽時(shí)幾個(gè)虛方法,分別是:dragEnterEvent(鼠標(biāo)拖拽進(jìn)入),dragLeaveEvent(鼠標(biāo)拖拽時(shí)離開),dragMoveEvent(拖拽時(shí)移動(dòng)),dropEvent(鼠標(biāo)釋放),(mousePressEvent)鼠標(biāo)按下,mouseMoveEvent(鼠標(biāo)移動(dòng))等。
鼠標(biāo)按下時(shí),記錄鼠標(biāo)按下位置和鼠標(biāo)點(diǎn)擊項(xiàng)
鼠標(biāo)移動(dòng)時(shí)構(gòu)造一個(gè)QDrag對(duì)象,并且執(zhí)行其exec方法,這個(gè)方法執(zhí)行后,直到dropEvent觸發(fā)后,mouseMoveEvent方法才會(huì)被再次觸發(fā),否則鼠標(biāo)移動(dòng)消息一直派發(fā)給dragMouseEvent。exec方法的之后,后續(xù)的鼠標(biāo)事件都會(huì)在drag打頭的方法中回調(diào)。
拖拽期間,鼠標(biāo)移動(dòng),并回調(diào)在dragMoveEvent方法中,可以在這個(gè)方法中修改鼠標(biāo)狀態(tài)。維護(hù)一些變量,比如效果圖上跟隨鼠標(biāo)一起移動(dòng)的一張圖片和綠色的指示插入位置的一條線。
最后鼠標(biāo)釋放時(shí),判斷如果需要更新拖拽項(xiàng)位置,那么把原有項(xiàng)刪除,并構(gòu)造新的項(xiàng)插入到目標(biāo)位置。
四、代碼說明
1、首先來看幾個(gè)關(guān)鍵的類
MimeData:存儲(chǔ)拖拽時(shí)數(shù)據(jù)
ListItem:item項(xiàng)定制,展示自定義結(jié)構(gòu)
DragList:視圖窗口
2、下面就直接上代碼,步驟對(duì)應(yīng)第三小節(jié)的思路
a、記錄鼠標(biāo)按下時(shí)信息
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式