Как сделать так чтобы при помощи мыши можно было изменить размер например кнопки или текста или QLineEdit

Мне нужно чтобы с помощью мышки можно было изменить размер кнопки или ещё чего как в Qt Design

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


Ответы (1 шт):

Автор решения: S. Nick

Как вариант. Попробуйте так:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

        
class ResizableRubberBand(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ResizableRubberBand, self).__init__(parent)

        self.draggable = True
        self.dragging_threshold = 5
        self.mousePressPos = None
        self.mouseMovePos = None
        self.borderRadius = 5

        self.setWindowFlags(QtCore.Qt.SubWindow)

        self.layout = QGridLayout(self)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setSpacing(0)
       
        self._band = QtWidgets.QRubberBand(
            QtWidgets.QRubberBand.Rectangle, self)

    def resizeEvent(self, event):
        self._band.resize(self.size())

    def paintEvent(self, event):
        window_size = self.size()
        qp = QtGui.QPainter()
        qp.begin(self)
        qp.setRenderHint(QtGui.QPainter.Antialiasing, True)
        qp.drawRoundedRect(0, 0, window_size.width(), window_size.height(),
                           self.borderRadius, self.borderRadius)
        qp.end()

    def mousePressEvent(self, event):
        if self.draggable and event.button() == QtCore.Qt.RightButton:
            self.mousePressPos = event.globalPos() 
            self.mouseMovePos = event.globalPos() - self.pos()
        super(ResizableRubberBand, self).mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if self.draggable and event.buttons() & QtCore.Qt.RightButton:
            globalPos = event.globalPos()
            moved = globalPos - self.mousePressPos
            if moved.manhattanLength() > self.dragging_threshold:
                diff = globalPos - self.mouseMovePos
                self.move(diff)
                self.mouseMovePos = globalPos - self.pos()
        super(ResizableRubberBand, self).mouseMoveEvent(event)

    def mouseReleaseEvent(self, event):
        if self.mousePressPos is not None:
            if event.button() == QtCore.Qt.RightButton:
                moved = event.globalPos() - self.mousePressPos
                if moved.manhattanLength() > self.dragging_threshold:
                    event.ignore()
                self.mousePressPos = None
        super(ResizableRubberBand, self).mouseReleaseEvent(event)


class SizeGrip(QSizeGrip): 
    def __init__(self, parent):
        super().__init__(parent)
        self.setFixedSize(QSize(5, 5))
        self.setStyleSheet("""
            QSizeGrip { 
                background-color: #6E2142;
                width: 3px; 
                height: 3px; 
                padding-left: 25px; 
                padding-bottom: 25px;
            } 
            QSizeGrip:hover { 
                background-color: rgb(255, 0, 0); 
            }
        """)
        

class MainWindow(QtWidgets.QWidget): 
    def __init__(self):
        super().__init__()
        
        self.list_widget = [
            ("label", "#ff6363", [100, 100, 150, 150]),
            ("pushButton", "#D9D9D9", [300, 200, 150, 50]),
            ("lineEdit", "#FFFFFF", [200, 500, 200, 50]),
        ]    
        
        for w, color, rect in self.list_widget: 
            band = ResizableRubberBand(self)
            band.setGeometry(*rect)        

            if w == "label":
                widget = QLabel("Label", alignment = Qt.AlignCenter)
            elif w == "pushButton":    
                widget = QPushButton("Button")
            elif w == "lineEdit":    
                widget = QLineEdit("LineEdit")            
            else:
                return

            widget.setObjectName(w)
            widget.setStyleSheet(f'#{w} {{background-color: {color};}}')
            widget.setSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                 QtWidgets.QSizePolicy.Minimum)
                                 
            sizeGrip1 = SizeGrip(band)
            sizeGrip2 = SizeGrip(band)
            sizeGrip3 = SizeGrip(band)
            sizeGrip4 = SizeGrip(band)

            band.layout.addWidget(sizeGrip1, 0, 0)
            band.layout.addWidget(sizeGrip2, 0, 2)
            band.layout.addWidget(sizeGrip3, 2, 2)
            band.layout.addWidget(sizeGrip4, 2, 0)
            band.layout.addWidget(widget, 1, 1)

            band.layout.setRowStretch(0, 0)
            band.layout.setRowStretch(1, 1)
            band.layout.setRowStretch(2, 0)
            band.layout.setColumnStretch(0, 0)
            band.layout.setColumnStretch(1, 1)
            band.layout.setColumnStretch(2, 0)        

    
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(500, 600)
    w.show()
    sys.exit(app.exec_())
    

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

→ Ссылка