[英]Resizing widget by dragging
我有一個自定義小部件。 我想通過拖動小部件的一角來調整大小。 目前,當光標靠近小部件的角落時,它會自動調整大小
這是示例代碼。 我想通過拖動右下角的紅色三角形來調整小部件的大小。 我能知道怎么做嗎?
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_())
好的,我想通了。 對於其他人,這里是問題中的修改后的代碼。 使用此代碼,您可以調整小部件的大小以及在主窗口或框架中移動自定義小部件。 要應用於您的代碼,您可以簡單地復制粘貼__init__()
下的代碼和鼠標事件下的代碼。
import sys
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QPainter, QPolygon
from PyQt5.QtWidgets import *
class Stack(QWidget):
def __init__(self, parent=None):
super(Stack, self).__init__(parent)
self.__mouseMovePos = None
self.setMouseTracking(True)
self._triangle = QPolygon()
self.start_pos = None
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):
self.__mousePressPos = None
self.__mouseMovePos = None
if event.button() == Qt.LeftButton:
if event.button() == Qt.LeftButton and self._triangle.containsPoint(
event.pos(), Qt.OddEvenFill
):
self.setCursor(Qt.SizeFDiagCursor)
self.start_pos = event.pos()
else:
self.__mousePressPos = event.globalPos()
self.__mouseMovePos = event.globalPos()
self.start_pos = None
self.unsetCursor()
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if self._triangle.containsPoint(event.pos(), Qt.OddEvenFill):
self.setCursor(Qt.SizeFDiagCursor)
else:
self.unsetCursor()
if event.buttons() == Qt.LeftButton:
if event.buttons() == Qt.LeftButton and self.start_pos is not None:
self.setCursor(Qt.SizeFDiagCursor)
delta = event.pos() - self.start_pos
self.resize(self.width() + delta.x(), self.height() + delta.y())
self.start_pos = event.pos()
elif not self._triangle.containsPoint(event.pos(), Qt.OddEvenFill):
currPos = self.mapToGlobal(self.pos())
globalPos = event.globalPos()
diff = globalPos - self.__mouseMovePos
newPos = self.mapFromGlobal(currPos + diff)
self.move(newPos)
self.__mouseMovePos = globalPos
self.start_pos = None
self.unsetCursor()
super().mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
if self.__mousePressPos is not None:
moved = event.globalPos() - self.__mousePressPos
if moved.manhattanLength() > 3:
event.ignore()
return
self.start_pos = None
super().mouseReleaseEvent(event)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Stack()
win.show()
sys.exit(app.exec_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.