| 63 | |
| 64 | |
| 65 | class DragListWidget(QListWidget): |
| 66 | # 可以往外拖的QListWidget |
| 67 | |
| 68 | def __init__(self, *args, **kwargs): |
| 69 | super(DragListWidget, self).__init__(*args, **kwargs) |
| 70 | self.resize(400, 400) |
| 71 | # 隐藏横向滚动条 |
| 72 | self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) |
| 73 | # 不能编辑 |
| 74 | self.setEditTriggers(self.NoEditTriggers) |
| 75 | # 开启拖功能 |
| 76 | self.setDragEnabled(True) |
| 77 | # 只能往外拖 |
| 78 | self.setDragDropMode(self.DragOnly) |
| 79 | # 忽略放 |
| 80 | self.setDefaultDropAction(Qt.IgnoreAction) |
| 81 | # ****重要的一句(作用是可以单选,多选。Ctrl、Shift多选,可从空白位置框选)**** |
| 82 | # ****不能用ExtendedSelection,因为它可以在选中item后继续框选会和拖拽冲突**** |
| 83 | self.setSelectionMode(self.ContiguousSelection) |
| 84 | # 设置从左到右、自动换行、依次排列 |
| 85 | self.setFlow(self.LeftToRight) |
| 86 | self.setWrapping(True) |
| 87 | self.setResizeMode(self.Adjust) |
| 88 | # item的间隔 |
| 89 | self.setSpacing(5) |
| 90 | # 橡皮筋(用于框选效果) |
| 91 | self._rubberPos = None |
| 92 | self._rubberBand = QRubberBand(QRubberBand.Rectangle, self) |
| 93 | |
| 94 | self.initItems() |
| 95 | |
| 96 | # 实现拖拽的时候预览效果图 |
| 97 | # 这里演示拼接所有的item截图(也可以自己写算法实现堆叠效果) |
| 98 | def startDrag(self, supportedActions): |
| 99 | items = self.selectedItems() |
| 100 | drag = QDrag(self) |
| 101 | mimeData = self.mimeData(items) |
| 102 | # 由于QMimeData只能设置image、urls、str、bytes等等不方便 |
| 103 | # 这里添加一个额外的属性直接把item放进去,后面可以根据item取出数据 |
| 104 | mimeData.setProperty('myItems', items) |
| 105 | drag.setMimeData(mimeData) |
| 106 | pixmap = QPixmap(self.viewport().visibleRegion().boundingRect().size()) |
| 107 | pixmap.fill(Qt.transparent) |
| 108 | painter = QPainter() |
| 109 | painter.begin(pixmap) |
| 110 | for item in items: |
| 111 | rect = self.visualRect(self.indexFromItem(item)) |
| 112 | painter.drawPixmap(rect, self.viewport().grab(rect)) |
| 113 | painter.end() |
| 114 | drag.setPixmap(pixmap) |
| 115 | drag.setHotSpot(self.viewport().mapFromGlobal(QCursor.pos())) |
| 116 | drag.exec_(supportedActions) |
| 117 | |
| 118 | def mousePressEvent(self, event): |
| 119 | # 列表框点击事件,用于设置框选工具的开始位置 |
| 120 | super(DragListWidget, self).mousePressEvent(event) |
| 121 | if event.buttons() != Qt.LeftButton or self.itemAt(event.pos()): |
| 122 | return |