簡體   English   中英

通過拖動調整小部件的大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM