Один из возможных вариантов может выглядеть примерно так:
import sys
from PyQt5.QtCore import Qt, QSize, QRect, QPoint, pyqtSignal
from PyQt5.QtGui import QColor, QPixmap, QDrag, QPainter, QCursor
from PyQt5.QtWidgets import QListWidget, QListWidgetItem, QLabel, \
QRubberBand, QApplication
class Label(QLabel):
clickedSignal = pyqtSignal(str)
def __init__(self, cname):
super().__init__()
self.cname = cname
def mousePressEvent(self, event):
self.clickedSignal.emit(self.cname)
class DragListWidget(QListWidget):
def __init__(self, *args, **kwargs):
super(DragListWidget, self).__init__(*args, **kwargs)
self.setWindowTitle('DragListWidget')
self.resize(230, 160)
# Скрыть горизонтальную полосу прокрутки
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
# Невозможно отредактировать
self.setEditTriggers(self.NoEditTriggers)
self.setDefaultDropAction(Qt.IgnoreAction)
self.setSelectionMode(self.NoSelection)
# Установите слева направо, оберните и упорядочьте по порядку
self.setFlow(self.LeftToRight)
self.setWrapping(True)
self.setResizeMode(self.Adjust)
# Интервал позиций
self.setSpacing(10)
self.initItems()
def makeItem(self, size, cname):
item = QListWidgetItem(self)
item.setSizeHint(size)
label = Label(cname)
label.clickedSignal.connect(lambda: print(f'cname = {cname}'))
label.setMargin(1)
label.resize(size)
pixmap = QPixmap(cname).scaled(30, 30, Qt.IgnoreAspectRatio)
label.setPixmap(pixmap)
self.setItemWidget(item, label)
def initItems(self):
size = QSize(32, 32)
for cname in [
'images/paint/cake.png', 'images/paint/edit.png',
'images/paint/eraser.png', 'images/paint/layer-shape.png',
'images/paint/layer-shape-ellipse.png', 'images/paint/layer-shape-line.png',
'images/paint/layer-shape-polygon.png', 'images/paint/layer-shape-polyline.png',
'images/paint/layer-shape-round.png', 'images/paint/magnifier-zoom.png',
'images/paint/paint-brush.png', 'images/paint/paint-can.png',
'images/paint/pencil.png', 'images/paint/pipette.png',
'images/paint/printer.png', 'images/paint/selection.png',
'images/paint/selection-poly.png','images/paint/spray.png',
'images/paint/stamp.png',
]:
#print(f'cname -> {cname}')
self.makeItem(size, cname)
if __name__ == '__main__':
app = QApplication(sys.argv)
wa = DragListWidget()
wa.show()
sys.exit(app.exec_())
