详解Qt 之QPainterPath

发布于:2024-07-31 ⋅ 阅读:(132) ⋅ 点赞:(0)


前言

QPainterPath 是 Qt 中用于绘制复杂形状的类。它提供了一种矢量图形的表示方式,允许用户绘制直线、曲线、矩形、圆形等图形,并进行布尔运算(如联合、相交、差集等)。与 QPainter 配合使用时,QPainterPath 可以显著简化绘图操作,并提高绘图的灵活性和可维护性。本文将详细介绍 QPainterPath 的功能、常用方法,并通过示例代码展示其实际应用。


QPainterPath 与 QPainter 的区别

QPainter 是 Qt 的基本绘图类,用于在设备上进行绘图操作,如绘制线条、矩形、文本和图像等。QPainter 直接在目标设备(如窗口、小部件或图像)上进行绘图操作。

QPainterPath 则是一个路径类,用于定义复杂的路径。这些路径可以包含多种图形元素,如直线、曲线、矩形和椭圆等。QPainterPath 主要用来描述图形,而 QPainter 用来绘制这些描述的图形。使用 QPainterPath 可以先定义图形路径,然后通过 QPainter 将其绘制到目标设备上。

在使用QPainterPath把路径画完之后,我们需要使用QPainter的drawPath把路径画上去才行

QPainterPath 的主要函数和成员

成员函数

构造函数和析构函数
  • QPainterPath()

    作用:构造一个空的路径对象。

    参数:无。

    返回值:无。

  • QPainterPath(const QPointF &startPoint)

    作用:构造一个以 startPoint 为起点的路径对象。

    参数

    • startPoint:路径的起点。

    返回值:无。

  • ~QPainterPath()

    作用:析构函数,销毁路径对象。

    参数:无。

    返回值:无。

路径操作
  • void moveTo(const QPointF &point)

    作用:将路径的当前点移动到 point

    参数

    • point:新的当前点。

    返回值:无。

  • void lineTo(const QPointF &point)

    作用:从当前点绘制一条直线到 point

    参数

    • point:直线的终点。

    返回值:无。

  • void arcTo(const QRectF &rect, qreal startAngle, qreal arcLength)

    作用:绘制一个以 rect 为边界的圆弧,从 startAngle 开始,弧长为 arcLength

    参数

    • rect:圆弧的边界矩形。
    • startAngle:起始角度(以度为单位)。
    • arcLength:弧长(以度为单位)。

    返回值:无。

  • void cubicTo(const QPointF &ctrlPt1, const QPointF &ctrlPt2, const QPointF &endPt)

    作用:绘制一个三次贝塞尔曲线,从当前点到 endPt,使用 ctrlPt1ctrlPt2 作为控制点。

    参数

    • ctrlPt1:第一个控制点。
    • ctrlPt2:第二个控制点。
    • endPt:曲线的终点。

    返回值:无。

  • void quadTo(const QPointF &ctrlPt, const QPointF &endPt)

    作用:绘制一个二次贝塞尔曲线,从当前点到 endPt,使用 ctrlPt 作为控制点。

    参数

    • ctrlPt:控制点。
    • endPt:曲线的终点。

    返回值:无。

  • void addRect(const QRectF &rect)

    作用:向路径中添加一个矩形。

    参数

    • rect:矩形区域。

    返回值:无。

  • void addEllipse(const QRectF &rect)

    作用:向路径中添加一个椭圆。

    参数

    • rect:椭圆的边界矩形。

    返回值:无。

  • void addPath(const QPainterPath &path)

    作用:向当前路径中添加另一个路径。

    参数

    • path:要添加的路径。

    返回值:无。

  • void closeSubpath()

    作用:闭合当前子路径。

    参数:无。

    返回值:无。

布尔运算
  • QPainterPath united(const QPainterPath &other) const

    作用:返回当前路径和 other 路径的并集。

    参数

    • other:另一个路径。

    返回值:并集路径。

  • QPainterPath intersected(const QPainterPath &other) const

    作用:返回当前路径和 other 路径的交集。

    参数

    • other:另一个路径。

    返回值:交集路径。

  • QPainterPath subtracted(const QPainterPath &other) const

    作用:返回当前路径和 other 路径的差集。

    参数

    • other:另一个路径。

    返回值:差路径。

几何计算
  • QRectF boundingRect() const

    作用:返回路径的边界矩形。

    参数:无。

    返回值:边界矩形。

  • qreal length() const

    作用:返回路径的长度。

    参数:无。

    返回值:路径长度。

  • QPointF pointAtPercent(qreal t) const

    作用:返回路径中百分比 t 处的点。

    参数

    • t:路径长度的百分比(0 到 1 之间)。

    返回值:路径上的点。

  • qreal angleAtPercent(qreal t) const

    作用:返回路径中百分比 t 处的切线角度。

    参数

    • t:路径长度的百分比(0 到 1 之间)。

    返回值:切线角度。

示例代码

示例 1:绘制简单路径

以下示例展示了如何使用 QPainterPath 绘制一条简单的路径,包括直线和曲线:

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPainterPath>

class PathWidget : public QWidget {
protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);
        QPainterPath path;
        path.moveTo(50, 50);
        path.lineTo(150, 50);
        path.cubicTo(200, 0, 250, 100, 300, 50);
        painter.drawPath(path);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    PathWidget widget;
    widget.show();
    return app.exec();
}

示例 2:使用布尔运算合并路径

以下示例展示了如何使用 QPainterPath 的布尔运算来合并两个路径:

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPainterPath>

class BooleanPathWidget : public QWidget {
protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);
        QPainterPath path1;
        path1.addRect(50, 50, 100, 100);

        QPainterPath path2;
        path2.addEllipse(100, 100, 100, 100);

        QPainterPath unitedPath = path1.united(path2);
        painter.drawPath(unitedPath);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    BooleanPathWidget widget;
    widget.show();
    return app.exec();
}

示例 3:计算路径长度和角度

以下示例展示了如何计算 QPainterPath 的长度和特定百分比处的角度:

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPainterPath>
#include <QDebug>

class LengthAngleWidget : public QWidget {
protected:
    void paintEvent(QPaintEvent *event) override {
        QPainter painter(this);
        QPainterPath path;
        path.moveTo(50, 50);
        path.lineTo(150, 50);
        path.cubicTo(200, 0, 250, 100, 300, 50);
        
        qreal length = path.length();
        qreal angle = path.angleAtPercent(0.5);
        
        qDebug() << "Path

length:" << length;
        qDebug() << "Angle at 50%:" << angle;
        
        painter.drawPath(path);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    LengthAngleWidget widget;
    widget.show();
    return app.exec();
}

更多用法…

在这里插入图片描述


总结

QPainterPath 提供了一种强大且灵活的方式来定义和操作路径。通过与 QPainter 配合使用,可以轻松绘制复杂的图形和进行几何运算。QPainterPath 支持多种图形元素和布尔运算,使其成为绘制和处理矢量图形的理想选择。通过本文的介绍和示例代码,读者可以更好地理解 QPainterPath 的使用方法及其在实际应用中的强大功能。


网站公告

今日签到

点亮在社区的每一天
去签到