Изменение размера виджета пользователем
Можно ли каким-либо способом сделать изменение размера QWidget пользователем. То есть с помощью растягивания мышью.
Update: изменение размера QWidget нужно сделать со всех сторон.
main.py
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class DragButton(QPushButton):
def mousePressEvent(self, event):
self.__mousePressPos = None
self.__mouseMovePos = None
if event.button() == Qt.LeftButton:
self.__mousePressPos = event.globalPos()
self.__mouseMovePos = event.globalPos()
super(DragButton, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton:
currPos = self.mapToGlobal(self.pos())
globalPos = event.globalPos()
diff = globalPos - self.__mouseMovePos
newPos = self.mapFromGlobal(currPos + diff)
self.move(newPos)
self.__mouseMovePos = globalPos
super(DragButton, self).mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
if self.__mousePressPos is not None:
moved = event.globalPos() - self.__mousePressPos
if moved.manhattanLength() > 3:
event.ignore()
return
super(DragButton, self).mouseReleaseEvent(event)
if __name__ == "__main__":
app = QApplication([])
w = QWidget()
w.resize(800,600)
button = DragButton("Drag", w)
w.show()
app.exec_()
И как суда изменение размера вставить?
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я обновил свой ответ Есть ли виджеты в PyQt5, размер которых может изменять пользователь? с учетом ваших пожеланий, попробуйте.
from PyQt5 import QtCore, QtGui, QtWidgets
class SizeGrip(QtWidgets.QSizeGrip):
def __init__(self, location_angle, parent):
super().__init__(parent)
parent.installEventFilter(self)
self.setFixedSize(30, 30)
self.location_angle = location_angle
if self.location_angle == 'left_top':
self.polygon = QtGui.QPolygon([
QtCore.QPoint(10, 20),
QtCore.QPoint(20, 10),
QtCore.QPoint(10, 10),
])
elif self.location_angle == 'right_top':
self.polygon = QtGui.QPolygon([
QtCore.QPoint(20, 10),
QtCore.QPoint(20, 20),
QtCore.QPoint(10, 10),
])
elif self.location_angle == 'left_bottom':
self.polygon = QtGui.QPolygon([
QtCore.QPoint(10, 20),
QtCore.QPoint(20, 20),
QtCore.QPoint(10, 10),
])
elif self.location_angle == 'right_bottom':
self.polygon = QtGui.QPolygon([
QtCore.QPoint(10, 20),
QtCore.QPoint(20, 10),
QtCore.QPoint(20, 20),
])
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.Resize:
if self.location_angle == 'left_top':
geo = QtCore.QRect(0, 0, 30, 30)
self.setGeometry(geo)
elif self.location_angle == 'right_top':
_geo = self.rect()
_geo.moveBottomRight(source.rect().bottomRight())
x = _geo.x()
geo = QtCore.QRect(x, 0, 30, 30)
self.setGeometry(geo)
elif self.location_angle == 'left_bottom':
_geo = self.rect()
_geo.moveBottomRight(source.rect().bottomRight())
y = _geo.y()
geo = QtCore.QRect(0, y, 30, 30)
self.setGeometry(geo)
elif self.location_angle == 'right_bottom':
geo = self.rect()
geo.moveBottomRight(source.rect().bottomRight())
self.setGeometry(geo)
return super().eventFilter(source, event)
def paintEvent(self, event):
qp = QtGui.QPainter(self)
qp.setPen(QtCore.Qt.white)
qp.setBrush(QtCore.Qt.red)
qp.drawPolygon(self.polygon)
class Container(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.sizeGrip1 = SizeGrip('left_top', self)
self.sizeGrip2 = SizeGrip('right_top', self)
self.sizeGrip3 = SizeGrip('left_bottom', self)
self.sizeGrip4 = SizeGrip('right_bottom', self)
self.startPos = None
layout = QtWidgets.QVBoxLayout(self)
layout.setContentsMargins(20, 20, 20, 20)
self.setStyleSheet('''
Container {
background: lightblue;
border: 0px;
border-radius: 4px;
}
''')
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.startPos = event.pos()
def mouseMoveEvent(self, event):
if self.startPos:
self.move(self.pos() + (event.pos() - self.startPos))
def mouseReleaseEvent(self, event):
self.startPos = None
class GraphicsRoundedFrame(QtWidgets.QGraphicsProxyWidget):
def __init__(self):
super().__init__()
self.container = Container()
self.setWidget(self.container)
def addWidget(self, widget):
self.container.layout().addWidget(widget)
def paint(self, qp, opt, widget):
qp.save()
p = QtGui.QPainterPath()
p.addRoundedRect(self.boundingRect().adjusted(0, 0, -.5, -.5), 4, 4)
qp.setClipPath(p)
super().paint(qp, opt, widget)
qp.restore()
class View(QtWidgets.QGraphicsView):
def __init__(self):
super().__init__()
scene = QtWidgets.QGraphicsScene()
self.setScene(scene)
self.setRenderHints(QtGui.QPainter.Antialiasing)
scene.setSceneRect(0, 0, 1024, 768)
texture = QtGui.QImage(30, 30, QtGui.QImage.Format_ARGB32)
qp = QtGui.QPainter(texture)
qp.setBrush(QtCore.Qt.white)
qp.setPen(QtGui.QPen(QtGui.QColor(189, 190, 191), 2))
qp.drawRect(texture.rect())
qp.end()
scene.setBackgroundBrush(QtGui.QBrush(texture))
testFrame = GraphicsRoundedFrame()
scene.addItem(testFrame)
testFrame.container.layout().addStretch(1)
self.label_2 = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
self.label_2.setPixmap(QtGui.QPixmap("lena.jpg").scaled(100, 100))
testFrame.addWidget(self.label_2)
testFrame.addWidget(QtWidgets.QLabel(
'lena.jpg', alignment=QtCore.Qt.AlignCenter))
testFrame.container.layout().addStretch(1)
testFrame.addWidget(QtWidgets.QPushButton('I am a button'))
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = View()
w.show()
sys.exit(app.exec_())
