PYQT5实现矩形框的拖动和改变大小(简易版文本框的实现)

该博客介绍了如何使用PyQt5库来创建一个GUI应用程序,用户可以拖动鼠标来绘制和调整矩形。程序通过重写鼠标事件处理函数实现了矩形的绘制、放大和移动功能,利用QPainter进行图形绘制,并提供了详细的代码示例。
摘要由CSDN通过智能技术生成
import sys, math
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class Drawing(QWidget):
    def __init__(self, parent=None):
        super(Drawing, self).__init__(parent)
        self.resize(600, 400)
        self.setWindowTitle('拖拽绘制矩形')
        self.rect = None
        self.move = False
        self.bigger = False
        self.x = 0
        self.y = 0
        self.singleOffset = QPoint(0, 0)
        self.isLeftPressed = bool(False)

    # 重写绘制函数
    def paintEvent(self, event):
        # 初始化绘图工具
        qp = QPainter()
        # 开始在窗口绘制
        qp.begin(self)
        # 自定义画点方法
        if self.rect:
            self.drawRect(qp)
        # 结束在窗口的绘制
        qp.end()

    def drawRect(self, qp):
        # 创建红色,宽度为4像素的画笔
        pen_line = QPen(Qt.red, 2)
        pen_ellipse = QPen(Qt.black, 1)

        brush_ellipse = QBrush(QColor(0, 78, 152))

        if self.rect[0] < self.x:
            qp.setPen(pen_line)
            # qp.drawLine(self.rect[0] + 4, self.rect[1] + 8, self.rect[0] + 4, self.y)  # 横向
            qp.drawLine(self.rect[0] + 8, self.rect[1] + 4, self.x, self.rect[1] + 4)  # 竖直
            # qp.drawLine(self.rect[0] + 8, self.y + 4, self.x, self.y + 4)
            # qp.drawLine(self.x + 4, self.rect[1] + 8, self.x + 4, self.y)

            qp.setPen(pen_ellipse)
            qp.setBrush(brush_ellipse)
            qp.drawEllipse(self.rect[0], self.rect[1], 8, 8)  # (startx, starty, w, h) 左上
            qp.drawEllipse(self.rect[0], self.y, 8, 8)  # (startx, starty, w, h) 左上
            qp.drawEllipse(self.x, self.rect[1], 8, 8)  # (startx, starty, w, h) 右上
            qp.drawEllipse(self.x, self.y, 8, 8)  # (startx, starty, w, h) 右下

            # qp.drawEllipse(self.rect[0] + self.rect[2] / 2, self.rect[1], 8, 8)  # (startx, starty, w, h) 上中
            # qp.drawEllipse(self.x - self.rect[2] / 2, self.y, 8, 8)  # (startx, starty, w, h) 下中
            qp.drawEllipse(self.rect[0], self.rect[1] + self.rect[3] / 2, 8, 8)  # (startx, starty, w, h) 左中
            qp.drawEllipse(self.x, self.rect[1] + self.rect[3] / 2, 8, 8)  # (startx, starty, w, h) 右中
        # else:
        #     qp.drawLine(self.rect[0] + 4, self.rect[1], self.rect[0] + 4, self.y + 8)  # 竖直
        #     qp.drawLine(self.rect[0], self.rect[1] + 4, self.x + 8, self.rect[1] + 4)  # 横向
        #     qp.drawLine(self.rect[0], self.y + 4, self.x + 8, self.y + 4)
        #     qp.drawLine(self.x + 4, self.rect[1], self.x + 4, self.y + 8)
        #
        #     qp.drawEllipse(self.rect[0], self.rect[1], 8, 8)  # (startx, starty, w, h) 左上
        #     qp.drawEllipse(self.rect[0], self.y, 8, 8)  # (startx, starty, w, h) 左上
        #     qp.drawEllipse(self.x, self.rect[1], 8, 8)  # (startx, starty, w, h) 右上
        #     qp.drawEllipse(self.x, self.y, 8, 8)  # (startx, starty, w, h) 右下
        #
        #     qp.drawEllipse(self.rect[0] + self.rect[2] / 2, self.rect[1], 8, 8)  # (startx, starty, w, h) 右上
        #     qp.drawEllipse(self.x - self.rect[2] / 2, self.y, 8, 8)  # (startx, starty, w, h) 右下
        # qp.drawRect(*self.rect)

    # 重写三个时间处理
    def mousePressEvent(self, event):
        print("mouse press")

        if event.buttons() == Qt.LeftButton:  # 左键按下
            # 左键按下(图片被点住),置Ture
            self.isLeftPressed = bool(True)
            print(event.pos(), " ", self.x, " ", self.y)

            if self.rect and (
                    event.pos().x() >= self.x and event.pos().x() <= self.x + 8 and (event.pos().y() >= self.rect[1]
                    and event.pos().y() <= self.rect[1] + 8) or (event.pos().y() >= self.rect[1] + self.rect[3] / 2
                    and event.pos().y() <= self.rect[1] + self.rect[3] / 2 + 8)
                    or(event.pos().y() >= self.y and event.pos().y() <= self.y + 8)):
                print("Big")
                self.bigger = True


            elif self.rect and (event.pos().x() <= self.x and event.pos().x() >= self.rect[0]
                                and event.pos().y() <= self.y and event.pos().y() >= self.rect[1]):
                print("MOVE!")
                self.move = True
                self.preMousePosition = event.pos()

            else:
                self.move = False
                self.bigger = False
                self.rect = (event.pos().x(), event.pos().y(), 0, 0)

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:  # 左键释放
            self.isLeftPressed = False  # 左键释放(图片被点住),置False
            self.bigger = False
            self.move = False
            print("mouse release")

    def mouseMoveEvent(self, event):
        start_x, start_y = self.rect[0:2]
        if self.isLeftPressed:

            if self.bigger:
                print("bigger")
                if event.pos().x() > self.rect[0]:
                    print(event.pos().x() - self.rect[0])
                    self.x, self.y = event.pos().x(), self.y

            elif self.move:
                differ = event.pos() - self.preMousePosition
                self.x, self.y = self.x + differ.x(), self.y + differ.y()
                start_x, start_y = start_x + differ.x(), start_y + differ.y()
                self.preMousePosition = event.pos()

            else:
                self.x = event.pos().x()
                self.y = event.pos().y()

            self.rect = (start_x, start_y, self.x - start_x, self.y - start_y)
            self.repaint()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Drawing()
    demo.show()
    sys.exit(app.exec_())

 

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用QGraphicsRectItem来实现拖动改变大小、可旋转的矩形,例如: ```python from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QGraphicsRectItem, QApplication from PyQt5.QtGui import QBrush, QPen, QPainter from PyQt5.QtCore import QPointF class RotatableRectItem(QGraphicsRectItem): def __init__(self, rect): super().__init__(rect) self.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemSendsGeometryChanges) self.brush = QBrush(QColor(255, 255, 255, 50)) self.pen = QPen(QColor(0, 0, 0, 255)) self.pen.setWidth(2) self.center = QPointF(self.boundingRect().center()) def paint(self, painter, option, widget): painter.setPen(self.pen) painter.setBrush(self.brush) painter.drawRect(self.rect()) def boundingRect(self): return super().boundingRect().adjusted(-2, -2, 2, 2) def itemChange(self, change, value): if change == QGraphicsItem.ItemPositionChange: self.center = QPointF(value.x() + self.boundingRect().width() / 2, value.y() + self.boundingRect().height() / 2) if change == QGraphicsItem.ItemRotationChange: self.setRotation(value) return super().itemChange(change, value) ``` 我们可以在QGraphicsScene中添加该矩形: ```python class MyScene(QGraphicsScene): def __init__(self): super().__init__() self.rect = RotatableRectItem(QRectF(0, 0, 100, 100)) self.addItem(self.rect) ``` 最后在QGraphicsView中显示该场景: ```python if __name__ == '__main__': app = QApplication([]) view = QGraphicsView() scene = MyScene() view.setScene(scene) view.show() app.exec() ``` 这样就可以展现一个可拖动改变大小、可旋转的矩形
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值