绘制几何图形
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,这两种填充规则如图所示。
-
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]) |
下面的程序用绘制多边形的方法绘制两个五角星,并分别采用奇偶填充规则和非零绕组填充规则进行填充,程序运行结果如图所示,
# -*- 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个角分别用一个圆进行倒圆角,其示意图如图所示。要绘制圆角矩形,除了需要设置绘制矩形的参数外,还需要设置椭圆的两个半径。
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)。
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)7x53 | drawPie(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文档)。