134-QPainter和Graphics/View绘图-QPainter绘图-绘制几何图形

绘制几何图形

QPainter 可以在绘图设备上绘制点、直线、折线矩形、圆、弧弦文本和图像等,绘制几何图形的方法介绍如下。

绘制点

QPainter 绘制点的方法如表所示。可以一次绘制一个点,也可以一次绘制多个点其中QPolygon和QPolygonF 是用于存储QPoint 和QPointF 的类

QPainter绘制单点的方法QPainter绘制多点的方法
drawPoint(p:QPoint)drawPoints(Sequence[QPointF])
drawPoint(pt:Union[QPointF,QPoint])drawPoints(Sequence[QPoint])
drawPoint(x:int,y: int)drawPoints(points:Union[QPolygon,Sequence[QPoint],QRect])
drawPoint(pt: QPainterPath.Element)drawPoints(points: Union[QPolygonF,.Sequence[QPointF],QPolygon,QRectF])

QPolygon和QPolygonF用于存储多个QPoint和QPointF,

  • 创建QPolygon实例的方法是QPolygon()或者QPolygon(Sequence[QPoint])
  • 创建 QPolygonF 实例的方法是QPolygonF()或QPolygonF(Sequence[Union[QPointF,QPoint]])。
  • 用QPolygon的append(QPoint)方法可以添加点,用insert(int,QPoint)方法可以插人点,用setPoint(int;QPoint)方法可以更改点;
  • 用QPolygonF的append(Union[QPointF,QPoint])方法可以添加点,用insert(int,Union[QPointF,QPoint])方法可以插人点。
绘制直线

QPainter 绘制直线的方法如表所示。绘制直线需要用两个点。可以一次绘制一条直线,也可一次绘制多条直线,其中 QLine或 QLineF 是2D 直线类。

QPainter绘制单条直线的方法QPainter绘制多条直线的方法
drawLine(line:QLine)drawLines(lines:Sequence[QLineF])
drawLine(line:Union[QLineF,QLine])drawLines(lintes:Sequence[QLine])
drawLine(pl:QPoint,p2:QPoint)drawLines(pointPairs:Sequence[QPointF])
drawLine(pl:Union[QPointF,QPoint],p2: Union[QPointF,QPoint])drawLines(pointPairs:Sequence[QPoint])
drawLine(x1:int,y1:int,x2:int,y2:int)drawLines(pointPairs:Sequence[QPoint])

QLine和 QLineF 用于定义二维直线,绘制二维直线需要用两个点。

  • 用QLine 类定义直线实例的方法有
    • QLine()
    • QLine(QPoint,QPoint)
    • QLine(xl:int,yl;int,x2:int;y2:int),
  • 用QLineF 类定义直线实例的方法有
    • QLineF(QLine)
    • QLineF()
    • QLineF(Union[QPointF,QPoint],Union[QPointF,QPoint])
    • QLineF(xl: float,yl: float,x2: float,y2: float)。
  • 用QLine的 setLine(xl;int,yl:int,x2;int,y2; int)方法、setP1(QPoint)方法、setP2(QPoint)或setPoints(QPoint,QPoint)方法可以设置线两端的点。
    • QLineF 也有同样的方法,只需把参数 int 改成float,或QPoint改成QPointF。
绘制折线

绘制折线必须用两个点,即使两条折线的终点和起始点相同,每条折线也必须用两个点来定义。折线由多个折线段构成,绘制折线需要给出多个点,上个折线段的终点是下个折线段的起始点。QPainter绘制折线的方法如表所示。

QPainter绘制折线的方法说明
drawPolyline(Sequence[QPointF])
drawPolyline(polygon: Union[QPolygon,Sequence[QPoint],QRect])
drawPolyline(Sequence[QPoint])
drawPolyline(Union[QPolygonF,Sequence[QPointF],QPolygon,QRectF])
QPainter 绘制多边形和凸多边形的方法

QPainter 绘制多边形和凸多边形的方法如表所示。

  • 使用这些方法时,需要给出多边形或凸多边形的顶点,系统会自动在起始点和终止点之间建立直线,使多边形封闭。

  • 参数fillRule是QtFillRule的举类型用于确定一个点是否在图形内部在内部的区域可以进行填充。filiRule可以取Qt.OddEvenFill或Qt.WindingFill,这两种填充规则如图所示。

    image-20230308132336777

    • Qt.OddEvenFill是奇偶填充规则,要判断一个点是否在图形中可以从该点向图形外引一条水平线,如果该水平线与图形的交点个数为奇数,那么该点在图形中。

    • Qt.WindingFil1是非零绕组填充规则要判断一个点是否在图形中可以从该点向图形外引一条水平线,如果该水平线与图形的边线相交,这个边线是顺时针绘制的,就记为1,是逆时针绘制的就记为-1,然后将所有数值相加,若结果不为 0,那么该点就在图形中。图形的绘制方向会影响填充的判断。

QPainter 绘制多边形的方法说明
drawPolygon(Sequence[QPointF],Qt.FillRule)使用填充规则fillRule绘制由给定点(QPointF)定义的多边形。
drawPolygon(Sequence[QPoint],Qt.FillRule)使用填充规则fillRule绘制由给定点(QPoint)定义的多边形。
drawPolygon(polygon: Union[QPolygon,Sequence[QPoint],QRect],fillRule: Qt.FillRule = Qt.OddEvenFill)
drawPolygon(polygon: Union[QPolygonF,Sequence[QPointF],QPolygon,QRectF],fillRule: Qt.FillRule = Qt.OddEvenFill)
QPainter 绘制凸多边形的方法说明
drawConvexPolygon(Sequence[QPointF])
drawConvexPolygon(Sequence[QPoint])
drawConvexPolygon(polygon:Union[QPolygon,Sequence[QPoint],QRect])
drawConvexPolygon(polygon: Union[QPolygonF,Sequence[QPointF],QPolygon,QRectF])

下面的程序用绘制多边形的方法绘制两个五角星,并分别采用奇偶填充规则和非零绕组填充规则进行填充,程序运行结果如图所示,

image-20230308133326289

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/8 13:24
# File_name: 05-绘制多边形的方法绘制两个五角星.py


from PySide6.QtWidgets import QApplication,QWidget
from PySide6.QtGui import QPen,QPainter,QBrush
from PySide6.QtCore import QPointF,Qt
from math import cos,sin,pi
import sys


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

        self.resize(600,500)

    def paintEvent(self,event):
        painter = QPainter(self)

        pen = QPen()# 钢笔
        pen.setWidth(2)# 线条宽度
        painter.setPen(pen)# 设置钢笔
        bush = QBrush(Qt.SolidPattern)
        painter.setBrush(bush)

        r = 100  # 五角星的外接圆半径

        x = self.width()/ 4
        y = self.height()/ 2
        p1 = QPointF(r * cos(-90 * pi / 180)+ x,r * sin(-90 * pi / 180)+ y)
        p2 = QPointF(r * cos(-18 * pi / 180)+ x,r * sin(-18 * pi / 180)+ y)
        p3 = QPointF(r * cos(54 * pi / 180)+ x,r * sin(54 * pi / 180)+ y)
        p4 = QPointF(r * cos(126 * pi / 180)+ x,r * sin(126 * pi / 180)+ y)
        p5 = QPointF(r * cos(198 * pi / 180)+ x,r * sin(198 * pi / 180)+ y)

        # 绘制多边形
        painter.drawPolygon([p1,p3,p5,p2,p4],Qt.FillRule.OddEvenFill)
        offset = QPointF(self.width()/ 2,0)
        painter.drawPolygon([p1 + offset,p3 + offset,p5 + offset,p2 + offset,p4 + offset],Qt.WindingFill)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWindow()

    win.show()
    sys.exit(app.exec())

绘制矩形

QPainter 可以一次绘制一个矩形,也可以一次绘制多个矩形。

QPainter 绘制矩形的方法如表所示,其中drawRect(xl:int,yl;int,w:int,h:int)方法中xl和y1参数确定左上角的位置,w 和h参数确定宽度和高度。

QPainter绘制单个矩形的方法QPainter绘制多个矩形的方法
drawRect(rect:QRect)drawRects(rectangles:Sequence[QRectF])
drawRect(rect: Union[QRectF,QRect])drawRects(rectangles:Sequence[QRect])
drawRect(xl:int,yl:int,w:int,h:int)
绘制圆角矩形

圆角矩形是在矩形的基础上对4个角分别用一个圆进行倒圆角,其示意图如图所示。要绘制圆角矩形,除了需要设置绘制矩形的参数外,还需要设置椭圆的两个半径。

image-20230308133517851

QPainter 绘制椭圆的方法有

  • drawRoundedRect(rect: Union[QRectF,QRect]xRadius: float,yRadius: float,mode: Qt.SizeMode =Qt AbsoluteSize)
  • drawRoundedRect(x; int,y: int,w; int,h; int,xRadius; float,yRadius: float,mode: Qt.SizeMode = QtAbsoluteSize)
  • 其中参数 mode是 Qt.SizeMode 的枚举类型可以取 Qt.AbsoluteSize或Qt.RelativeSize,分别确定圆半径是绝对值还是相对于矩形边长的相对值。
绘制椭圆、扇形、弧和弦

一个椭圆有两个半径。确定一个椭圆有两种方法:

  • 一种是先确定一个矩形边界,在矩形内部作一个与矩形相切的内切椭圆
  • 另一种是先定义一个中心,再定义两个半径。

绘制椭圆示意图如图所示。

  • 如果矩形边界是正方形或者圆的两个半径相等,圆就变成了圆。

  • 扇形是椭圆的一部分,绘制扇形时除了确定椭圆的几何数据外,还需要确定扇形的起始角和跨度角。需要特别注意的是,起始角和跨度角都是用输人值的 1/16 计算,如要求起始角为45°,跨度角为60则需要输人的起始角为45*16,跨度角为60*16,例如 painter.drawPie(QRect(300,300,200,100),45 * 16,60*16)。

    image-20230308133947802

QPainter 绘制圆和扇形的方法如表所示

QPainter绘制椭圆的方法QPainter 绘制扇形的方法
drawEllipse(center:[QPointF,QPoint],rx:int,ry: int)drawPie(QRect,a: int,alen:int)
drawEllipse(r:QRect)drawPie(rect:Union[QRectF,QRect],a: int,alen: int)
drawEllipse(r:Union[QRectF,QRect])Q)7x53drawPie(x;int,y:int,w:int,h;int,a: int,alen: int)
drawEllipse(x;int,y:int,w:int,h:int)
drawEllipse(center:QPainterPath.Element,rx: float,ry: float)

绘制弧和绘制弦的参数与绘制扇形的参数相同,只不过是从圆上截取的部分不同QPainter绘制弧和弦的方法如表所示。

QPainter绘制弧的方法QPainter绘制弦的方法
drawArc(QRect,a: int,alen: int)drawChord(QRect,a; int,alen:int)
drawArc(rect: Union[QRectF,QRect],a: int,alen:int)drawChord(rect:Union[QRectF,QRect],a: int,alen: int)
drawArc(x:int,y;int,w:int,h;int,a: int,alen: int)drawChord(x;int,y:int,w:int,h:int,a: int,alen: int)
抗锯齿

在绘制几何图像和文字时,如果线条是斜线,对线条进行放大后会发现它呈现锯齿状为防止出现锯齿状需要对线条边缘进行模糊化处理。

  • 用QPainter 的setRenderHint(hint;QPainter,RenderHint,on; bool=True)或 setRenderHints(hints; QPainter.RenderHints.on;bool=True)方法可以设置是否进行抗锯齿处理,
  • 用testRenderHint(hint;QPainter.RenderHint)方法可以获取是否设置了抗锯算法其中枚举参数 QPainter.RenderHint可以取:
    • QPainter.Antialiasing(启用抗锯齿)
    • QPainter,TextAntialiasing(对文本进行抗锯齿)
    • QPainter.SmoothPixmapTransform(使用平滑的像素图像算法)
    • QPainter.LosslessImageRendering(用于PDF文档)。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

士别三日,当挖目相待

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

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

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

打赏作者

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

抵扣说明:

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

余额充值