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