MCPcopy Create free account
hub / github.com/PyQt5/PyQt / DragListWidget

Class DragListWidget

QListWidget/DragDrop.py:65–159  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

63
64
65class 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

Callers 1

DragDrop.pyFile · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected