Qt | QListView美化-卡片拖拽-动画效果

一、效果图

请添加图片描述

二、获取方式

源码可以在Github上下载,后续会不断更新,并且提供C++版本组件,欢迎各位关注。

  1. Github :https://github.com/Rev-RoastedDuck/Qt-RoastedDuck-Widgets.git
  2. 视频主页:https://space.bilibili.com/439475163/video
  3. CSDN主页:https://blog.csdn.net/m0_72760466

三、声明

本文使用了遵循GPLv3许可证的开源代码-Qt-RoastedDuck-Widgets,以下代码遵循GPLv3许可证。

四、部分代码

class CardListView(QListView):
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.is_to_left = False
        self.anim_index: QModelIndex = QModelIndex()
        self.animInit()
        self.setAutoScroll(False)

    def dragEnterEvent(self, event: QDragEnterEvent) -> None:
        super().dragEnterEvent(event)
        self.is_draging = True
        self.index_drag_item = self.indexAt(event.position().toPoint())

    def dropEvent(self, event: QDropEvent) -> None:
        super().dropEvent(event)
        self.is_draging = False
        data = self.index_drag_item.data()
        draged_row_old = self.index_drag_item.row()
        draged_row_new = self.indexAt(event.position().toPoint()).row()

        self.model().removeRow(draged_row_old)

        item = QStandardItem()
        item.setData(data, Qt.DisplayRole)
        self.model().insertRow(draged_row_new, item)

        # 保持选中
        index = self.model().index(draged_row_new, 0, QModelIndex())
        self.setCurrentIndex(index)

    def dragMoveEvent(self, event:QDragMoveEvent):
        super().dragMoveEvent(event)
        x = event.position().x()
        scroll_area_width = self.viewport().width()

        curr_index = self.indexAt(event.position().toPoint())
        delagate = self.itemDelegate()
        if isinstance(delagate, CardDelegate):
            delagate.drag_move_curr_index = curr_index

        if x < 30:
            self.is_to_left = True
            self.timer.start()
        elif x > scroll_area_width - 30:
            self.is_to_left = False
            self.timer.start()
        else:
            self.timer.stop()

    def animInit(self):
        self.timer = QTimer()
        self.timer.setInterval(10)
        self.timer.timeout.connect(self.__scrollBarMove)

    def __scrollBarMove(self):
        if self.is_to_left:
            self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - 4)
        else:
            self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() + 4)

    def mouseReleaseEvent(self, e: QMouseEvent) -> None:
        super().mouseReleaseEvent(e)
        self.timer.stop()

    def keyPressEvent(self, event: QKeyEvent):
        super().keyPressEvent(event)
        if event.key() == Qt.Key_Delete:
            self.delItem()

    def delItem(self):
        selected_indexes = self.selectedIndexes()
        if not selected_indexes:
            return
        selected_index = selected_indexes[0]
        index_rect = self.visualRect(selected_index)

        delagate = self.itemDelegate()
        if isinstance(delagate, CardDelegate):
            delagate.animStart(list_view=self, index=selected_index, index_rect=index_rect)

        self.setCurrentIndex(selected_index)

    def addItem(self):
        pass
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值