PyQt5绘制图形(圆、矩形、斜矩形、多边形)

矩形

在这里插入图片描述

from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QWidget, QApplication


class DrawRect(QWidget):
    def __init__(self, parent=None):
        super(DrawRect, self).__init__(parent)
        self.resize(600, 400)
        self.start_point = None
        self.end_point = None
        self.start = False
        self.drawing = False
        self.setCursor(Qt.CrossCursor)
        self.setMouseTracking(True)

    def paintEvent(self, event):
        super(DrawRect, self).paintEvent(event)
        if self.drawing:
            painter = QPainter()
            painter.begin(self)
            pen = QPen(Qt.red, 5)
            painter.setPen(pen)
            painter.drawRect(QRect(self.start_point, self.end_point))
            painter.end()

    def mousePressEvent(self, event):
        if not self.start:
            self.start_point = event.pos()
            self.start = True

    def mouseReleaseEvent(self, event):
        if self.drawing:
            self.drawing = False
            self.start = False

    def mouseMoveEvent(self, event):
        if self.start:
            self.end_point = event.pos()
            self.drawing = True
            self.update()
        
        
if __name__ == '__main__':
    app = QApplication([])
    demo = DrawRect()
    demo.show()
    app.exec_()

在这里插入图片描述

import math

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QWidget, QApplication


class DrawRect(QWidget):
    def __init__(self, parent=None):
        super(DrawRect, self).__init__(parent)
        self.resize(600, 400)
        self.start_point = None
        self.end_point = None
        self.start = False
        self.drawing = False
        self.radius = 0
        self.setCursor(Qt.CrossCursor)
        self.setMouseTracking(True)

    def paintEvent(self, event):
        super(DrawRect, self).paintEvent(event)
        if self.drawing:
            painter = QPainter()
            painter.begin(self)
            pen = QPen(Qt.red, 5)
            painter.setPen(pen)
            painter.drawEllipse(self.start_point, self.radius, self.radius)
            painter.end()

    def mousePressEvent(self, event):
        if not self.start:
            self.start_point = event.pos()
            self.start = True

    def mouseReleaseEvent(self, event):
        if self.drawing:
            self.drawing = False
            self.start = False

    def mouseMoveEvent(self, event):
        if self.start:
            self.end_point = event.pos()
            self.radius = self.calc_radius()
            self.drawing = True
            self.update()

    def calc_radius(self):
        return math.sqrt(
            (self.start_point.x() - self.end_point.x()) ** 2 + (self.start_point.y() - self.end_point.y()) ** 2)


if __name__ == '__main__':
    app = QApplication([])
    demo = DrawRect()
    demo.show()
    app.exec_()

斜矩形

请添加图片描述

from PyQt5.QtCore import Qt, QPointF, QLineF
from PyQt5.QtGui import QPainter, QPen, QPolygonF
from PyQt5.QtWidgets import QWidget, QApplication


class DrawRect(QWidget):
    def __init__(self, parent=None):
        super(DrawRect, self).__init__(parent)
        self.resize(600, 400)
        self.point1 = None
        self.point2 = None
        self.cursor_point = None
        self.point_count = 0
        self.line = None
        self.polygon = None
        self.end = False
        self.is_line = False
        self.is_polygon = False
        self.setCursor(Qt.CrossCursor)
        self.setMouseTracking(True)

    def paintEvent(self, event):
        super(DrawRect, self).paintEvent(event)
        if self.is_polygon and self.polygon:
            painter = QPainter()
            painter.begin(self)
            pen = QPen(Qt.red, 5)
            painter.setPen(pen)
            painter.drawPolygon(self.polygon)
            painter.end()
        elif self.is_line and self.line:
            painter = QPainter()
            painter.begin(self)
            pen = QPen(Qt.red, 5)
            painter.setPen(pen)
            painter.drawLine(self.line)
            painter.end()

    def mousePressEvent(self, event):
        if self.point_count == 0:
            self.point1 = event.pos()
            self.point_count = 1
        elif self.point_count == 1:
            self.point2 = event.pos()
            self.point_count = 2

    def mouseReleaseEvent(self, event):
        if self.end:
            self.end = False
            self.point_count = 0

    def mouseMoveEvent(self, event):
        if self.point_count == 1:
            self.is_line = True
            self.is_polygon = False
            self.point2 = event.pos()
            self.calc_line()
        if self.point_count == 2:
            self.cursor_point = event.pos()
            self.calc_polygon()
            self.end = True
            self.is_line = False
            self.is_polygon = True
        self.update()

    def calc_line(self):
        self.line = QLineF(self.point1, self.point2)

    def calc_polygon(self):
        point_list = [self.point1, self.point2]
        x1 = self.point1.x()
        y1 = self.point1.y()
        x2 = self.point2.x()
        y2 = self.point2.y()
        x3 = self.cursor_point.x()
        y3 = (x2 ** 2 - 2 * x1 * x2 + y2 ** 2 - 2 * y1 * y2 + y2 ** 2 + x2 ** 2 - 2 * x2 * x3 + 2 * x1 * x3) / (
                2 * y2 - 2 * y1)
        # 参考链接:https://blog.csdn.net/zhouschina/article/details/14647587
        dx = x2 - x3
        dy = y2 - y3
        if abs(dx) < 0.00000001 and abs(dy) < 0.00000001:
            return
        u = (self.cursor_point.x() - x2) * (x2 - x3) + (self.cursor_point.y() - y2) * (y2 - y3)
        u = u / ((dx * dx) + (dy * dy))
        x3 = x2 + u * dx
        y3 = y2 + u * dy
        point3 = QPointF(x3, y3)
        point_list.append(point3)
        x4 = x1 + x3 - x2
        y4 = y1 + y3 - y2
        point4 = QPointF(x4, y4)
        point_list.append(point4)
        self.polygon = QPolygonF(point_list)


if __name__ == '__main__':
    app = QApplication([])
    demo = DrawRect()
    demo.show()
    app.exec_()

多边形

请添加图片描述

from PyQt5.QtCore import Qt, QLineF
from PyQt5.QtGui import QPainter, QPen, QPolygonF
from PyQt5.QtWidgets import QWidget, QApplication


class DrawPolygon(QWidget):
    def __init__(self, parent=None):
        super(DrawPolygon, self).__init__(parent)

        self.resize(600, 400)

        self.setCursor(Qt.CrossCursor)
        self.setMouseTracking(True)

        self.line_list = []
        self.point_list = []
        self.cursor_point = None
        self.end_point = None

    def paintEvent(self, event):
        super(DrawPolygon, self).paintEvent(event)
        if not self.point_list:
            return
        if self.end_point:
            painter = QPainter()
            painter.begin(self)
            pen = QPen(Qt.red, 5)
            painter.setPen(pen)
            polygon = QPolygonF(self.point_list)
            painter.drawPolygon(polygon)
            painter.end()
            return
        if len(self.point_list) == 1:
            painter = QPainter()
            painter.begin(self)
            pen = QPen(Qt.red, 5)
            painter.setPen(pen)
            line = QLineF(self.point_list[0], self.cursor_point)
            painter.drawLine(line)
            painter.end()
        else:
            painter = QPainter()
            painter.begin(self)
            pen = QPen(Qt.red, 5)
            painter.setPen(pen)
            polygon = QPolygonF(self.point_list + [self.cursor_point])
            painter.drawPolygon(polygon)
            painter.end()

    def mousePressEvent(self, event):
        if self.end_point:
            # 重新开始绘制
            self.point_list = []
            self.end_point = None
        self.point_list.append(event.pos())
        self.update()

    def mouseDoubleClickEvent(self, event) -> None:
        self.end_point = event.pos()
        self.point_list.append(self.end_point)
        self.update()

    def mouseMoveEvent(self, event):
        self.cursor_point = event.pos()
        self.update()


if __name__ == '__main__':
    app = QApplication([])
    demo = DrawPolygon()
    demo.show()
    app.exec_()

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyQt5中的QPainter提供了丰富的绘图功能,可以用于绘制各种图形,包括直线、矩形形、椭多边形、贝塞尔曲线等。下面分别介绍这些图形绘制方法。 ### 直线 绘制直线可以使用QPainter的drawLine()方法。该方法需要指定直线的起点和终点坐标。 ```python from PyQt5.QtGui import QPainter, QPen from PyQt5.QtCore import Qt pen = QPen(Qt.black) # 创建画笔对象 pen.setWidth(2) # 设置画笔宽度 painter = QPainter() # 创建画家对象 painter.begin(self) # 开始绘画 painter.setPen(pen) # 设置画笔 painter.drawLine(0, 0, 100, 100) # 绘制直线 painter.end() # 结束绘画 ``` ### 矩形 绘制矩形可以使用QPainter的drawRect()方法。该方法需要指定矩形左上角坐标和矩形的宽度和高度。 ```python painter.drawRect(50, 50, 100, 100) # 绘制矩形 ``` ### 绘制形可以使用QPainter的drawEllipse()方法。该方法需要指定形的外接矩形。 ```python painter.drawEllipse(50, 50, 100, 100) # 绘制形 ``` ### 椭 绘制可以使用QPainter的drawEllipse()方法。该方法需要指定椭的外接矩形。 ```python painter.drawEllipse(50, 50, 100, 50) # 绘制 ``` ### 多边形 绘制多边形可以使用QPainter的drawPolygon()方法。该方法需要指定多边形的各个顶点坐标。 ```python points = [QPoint(50, 50), QPoint(100, 50), QPoint(100, 100), QPoint(50, 100)] painter.drawPolygon(points) # 绘制多边形 ``` ### 贝塞尔曲线 绘制贝塞尔曲线可以使用QPainter的drawBezierCurve()方法。该方法需要指定曲线的起点、控制点和终点坐标。 ```python painter.drawBezierCurve(50, 50, 75, 100, 125, 100, 150, 50) # 绘制贝塞尔曲线 ``` 以上是QPainter绘制各种图形的方法,你可以根据需要进行选择和组合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

llc的足迹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值