一、效果图
二、获取方式
源码可以在Github上下载,后续会不断更新,并且提供C++版本组件,欢迎各位关注。
- Github :https://github.com/Rev-RoastedDuck/Qt-RoastedDuck-Widgets.git
- 视频主页:https://space.bilibili.com/439475163/video
- 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