【发布时间】:2020-11-17 14:29:24
【问题描述】:
我有一个自定义小部件。我想通过拖动小部件的一角来调整大小。目前,当光标靠近小部件的角落时,它会自动调整大小
这里是示例代码。我想通过拖动右下角的红色三角形来调整小部件的大小。我可以知道该怎么做吗?
from PyQt5.QtCore import Qt, QPoint, QPointF, QEvent
from PyQt5.QtGui import QPainter, QIcon, QColor, QPolygon
from PyQt5.QtWidgets import *
import sys
class Stack(QWidget):
def __init__(self, parent=None):
super(Stack, self).__init__(parent)
self._triangle = QPolygon()
self.setMouseTracking(True)
self.old_x_pos = 0
self.old_y_pos = 0
def _recalculate_triangle(self):
p = QPoint(self.width() - 20, self.height() - 10)
q = QPoint(self.width() - 10, self.height() - 20)
r = QPoint(self.width() - 10, self.height() - 10)
self._triangle = QPolygon([p, q, r])
self.update()
def resizeEvent(self, event):
self._recalculate_triangle()
def paintEvent(self, event):
super(Stack, self).paintEvent(event)
qp = QPainter(self)
qp.setPen(Qt.white)
qp.setBrush(Qt.white)
qp.drawRect(10, 10, 150, 150)
qp.setPen(Qt.white)
qp.setBrush(Qt.red)
qp.drawPolygon(self._triangle)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton and self._triangle.containsPoint(
event.pos(), Qt.OddEvenFill
):
self.setCursor(Qt.SizeFDiagCursor)
else:
self.unsetCursor()
super(Stack, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
if self._triangle.containsPoint(event.pos(), Qt.OddEvenFill):
self.setCursor(Qt.SizeFDiagCursor)
self.setCursor(Qt.SizeFDiagCursor)
if event.x() > self.old_x_pos and event.y() > self.old_y_pos:
self.resize(self.width() + (self.width() - event.x()), self.height() + (self.height() - event.y()))
elif event.x() < self.old_x_pos and event.y() < self.old_y_pos:
self.resize(self.width() - (self.width() - event.x()), self.height() - (self.height() - event.y()))
else:
self.unsetCursor()
print(self.old_y_pos)
self.old_x_pos = event.x()
self.old_y_pos = event.y()
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Stack()
win.show()
sys.exit(app.exec_())
【问题讨论】:
-
只是出于好奇:你有没有想过使用QSizeGrip?
-
好的,我现在刚刚尝试过
self.gripper = QSizeGrip(self) layout.addWidget(self.gripper,0, QtCore.Qt.AlignRight | QtCore.Qt.AlignBottom),但它会调整整个窗口的大小而不是小部件。你能告诉我如何正确使用它吗? -
您没有指定小部件将被添加到父级。然后我不明白你为什么不直接关注并尝试理解[你自己的问题]的答案(这能回答你的问题吗?Resizing custom widget by dragging the edges in pyqt5)(这使得它重复)。如果有什么你不明白的地方,请在那里提问或澄清对新问题的具体需求。