QPainterPath绘制复合图形

简述

QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状。

绘图路径是由许多图形化的构建块组成的对象,例如:矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆。封闭的路径的起点和终点是一致的,或者他们可以作为未封闭的子路径独立存在,如:直线和曲线。

QPainterPath 可以被填充、描绘轮廓、裁剪。

QPainterPath 提供了一组函数,可用于获取绘图路径及其元素的信息。除了可以使用 toReversed() 函数来改变元素的顺序外,还有几个函数将 QPainterPath 对象转换成一个多边形表示1

同心圆弧绘制的两种方法

布尔运算

我们可以在之前的基础上加一些处理,从而实现一个圆弧2

这种方法基本思想是采用布尔运算,从一个完整图形中裁剪一部分得到预期图形。

绘制效果如下:
在这里插入图片描述

路径绘制

绘制效果如下:

在这里插入图片描述

实现代码

Method 1是布尔运算,Method 2是路径绘制实现。

void MainWindow::slot_addConcentricArc()
{
    QPainterPath path, subPath;
    qreal startAngle, spanAngle, insideRadius, outsideRadius;

    QPen pen(QColor(0,0,0,0));
    QBrush brush(Qt::red);

    int method = 0;
    startAngle = 0;
    spanAngle = 45;
    insideRadius = 25;
    outsideRadius = 50;

    QRectF rect = QRectF(-outsideRadius, -outsideRadius, outsideRadius * 2, outsideRadius * 2);
    QRectF subRect = QRectF(-insideRadius, -insideRadius, insideRadius * 2, insideRadius * 2);

    switch (method)
    {
        case 0://Method 1
            path.arcTo(rect, startAngle, spanAngle);
            path.closeSubpath();
            subPath.addEllipse(subRect);
            path -= subPath;
            break;
        case 1://Method 2
            //QPointF startPt, endPt;
            path.moveTo(insideRadius, 0);
            path.lineTo(outsideRadius, 0);
            path.arcTo(rect, startAngle, spanAngle);
            //startPt = path.currentPosition();
            path.arcTo(subRect, spanAngle + startAngle, -spanAngle);
            //endPt = path.currentPosition();
            //path.lineTo(startPt);
            break;
    }
    m_view->scene()->addPath(path, pen, brush);
}

注意点

1、使用布尔运算有个小缺陷,在半径较小时会出现失真现象。

2、使用路径绘制时会多一条内部线,由于QPen设置为透明并且有QBrush所以未凸显出该缺陷,可根据实际情况选择。
2、修改了代码,见上边注释部分;

失真现象

设置参数如下:

    int method = 0;
    startAngle = 0;
    spanAngle = 45;
    insideRadius = 1;
    outsideRadius = 5;

在这里插入图片描述

内部线现象 已解决

设置参数如下:

    QPen pen(Qt::black);
    QBrush brush(Qt::red);

    int method = 1;
    startAngle = 0;
    spanAngle = 45;
    insideRadius = 1;
    outsideRadius = 5;

原图:
在这里插入图片描述
修改后:
在这里插入图片描述
对于留言区的原点疑问,加粗边线后无原点显示。
在这里插入图片描述

附录

csdn源码下载链接


  1. Qt 之图形(QPainterPath)——「一去丶二三里」. ↩︎

  2. Qt 之图形(绘制漂亮的圆弧)——「一去丶二三里」. ↩︎

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐