Как сделать так чтобы при помощи мыши можно было изменить размер например кнопки или текста или QLineEdit
Ответы (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_())

