Как реализовать панель выбора фигуры для отрисовки в PyQt5?

Рейтинг: 0Ответов: 1Опубликовано: 06.02.2023

Как реализовать следующую панель (эта панель взята из Paint) для выбора отрисовки фигуры на Python с помощью PyQt5?

Панель для выбора фигуры

Какие виджеты можно для этого использовать или кнопки?
Может есть информационный ресурс где есть пример с реализацией похожей панели?
Также может есть пример самой отрисовки данных фигур?

Заранее благодарен.

Ответы

▲ 0

Один из возможных вариантов может выглядеть примерно так:

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_())

введите сюда описание изображения