- 如果要绘制一个复杂图形,尤其是要重复绘制这样的图形,可以使用QPainterPath类,并使用**QPainter::drawPath()**进行绘制。
- 一个绘图路径就由多个矩形、椭圆、线条或者曲线等组成的对象,一个路径可以是封闭的,也可以是非封闭的。
1. 组成一个路径
![在这里插入图片描述](https://img-blog.csdnimg.cn/7fbbd51b294d4b35aa9649a226694892.png)
QPainter painter(this);
QPainterPath path;
path.moveTo(50,250);
path.lineTo(50,230);
path.cubicTo(QPointF(105,40),QPointF(115,80),QPointF(120,60));
path.lineTo(130,130);
path.addEllipse(QPointF(130,130),30,20);
painter.setPen(Qt::darkYellow);
painter.drawPath(path);
path.translate(200,0);
painter.setPen(Qt::darkBlue);
painter.drawPath(path);
2. 填充规则
![在这里插入图片描述](https://img-blog.csdnimg.cn/0dbc3cb7ce5249a091547bf848014ba2.png)
QPainter painter(this);
QPainterPath path;
path.addEllipse(10,50,100,100);
path.addRect(50,100,100,100);
painter.setBrush(Qt::darkCyan);
painter.drawPath(path);
painter.translate(180,0);
path.setFillRule(Qt::WindingFill);
painter.drawPath(path);
![在这里插入图片描述](https://img-blog.csdnimg.cn/9201b1278bef4070ad39deed5a087825.png)
- Qt::OddEvenFill : 奇偶填充规则,从一点向图形外引一条水平线,如果和图形的交点的个数为奇数,该点在图形中。
- Qt::WindingFill: 非零弯曲规则,从该点向图形外引一条水平线,与图形的边线相交。如果变现实顺时针绘制的,记为1,是逆时针绘制的,记为-1。所有结果相加不为0,该点在图形中。(默认的矩形和椭圆都是顺时针绘制的)