一、需求說明
上一篇文章Qt之QAbstractItemView視圖項拖拽(一)講述了實現(xiàn)QAbstractItemView視圖項拖拽的一種方式,是基于QDrag實現(xiàn)的,這個類是qt自己封裝好了的,所以可定制性也就沒有了那么強,最明顯的是,這個類在執(zhí)行exec方法后,mouse系列的回調(diào)接口就被阻塞了,隨之而來的問題就是拖拽時item項沒有了hover特性,為了解決這個問題,我們就不能使用QDrag類來實現(xiàn)拖拽了,這也是這篇文章我要講述的內(nèi)容。
二、效果展示
如圖1是demo的效果展示,比較丑,如果加上優(yōu)秀的qss,那必然能讓人眼前一亮
圖1 ListWidget拖拽
三、實現(xiàn)思路
- 繼承QListWidget類,重寫其鼠標(biāo)多拽時幾個虛方法,分別是mousePressEvent(鼠標(biāo)按下),mouseMoveEvent(鼠標(biāo)移動),mouseReleaseEvent(鼠標(biāo)彈起)等,當(dāng)然還包括一些輔助的回調(diào)方法enterEvent和leaveEvent。
- 鼠標(biāo)按下時,記錄鼠標(biāo)按下位置和鼠標(biāo)點擊項
- 鼠標(biāo)移動時移動插入項標(biāo)示和item項快照位置,并修改鼠標(biāo)形狀
- 最后鼠標(biāo)釋放時,判斷如果需要更新拖拽項位置,那么把原有項刪除,并構(gòu)造新的項插入到目標(biāo)位置
上邊的幾個步驟描述都是在mouse系列的回到接口中發(fā)生的,再也沒有QDrag的事兒啦。當(dāng)然這個mouse方法中需要做一些鼠標(biāo)狀態(tài)維護等。
四、代碼說明
1、重要的類和上一篇文章中的一樣,忘記的小伙伴可以到上一篇文章查看,或者猛戳Qt之QAbstractItemView視圖項拖拽(一)
2、下面就直接上代碼
a