Qt 绘图QPainterPath < 三 >

Qt 绘图QPainterPath < 三 >

QPainterPath 对象可用于填充、勾勒和裁剪。与普通绘图操作相比,绘制路径的主要优势在于,复杂的形状只需要创建一次;然后只需调用QPainter::drawPath()函数就可以多次绘制它们。

QPainterPath提供了一组函数,可用于获取路径及其元素的信息。此外,还可以使用toReversed函数反转元素的顺序。还有几个函数可以将这个画家路径对象转换为多边形表示。

QPainterPath与 QPainter

QPainterPathQPainter 是 Qt 中用于绘图的两个关键类,它们之间有密切的关系。

  1. QPainterPath 是一个用于描述和操作绘图路径的类。路径(Path)是一系列的直线段、曲线段和其他图元的集合,它定义了绘图的形状。QPainterPath 可以用于构建和操作复杂的图形路径,包括直线、曲线、圆弧等。它提供了一系列的方法来添加、移动、合并、裁剪等操作,以便创建和处理图形路径。
  2. QPainter 是一个用于在各种设备上进行绘图的类。它提供了一系列的方法来在图形上下文中进行绘制,包括直线、曲线、矩形、椭圆等。QPainter 的绘制操作可以基于已有的路径(QPainterPath)进行,通过 drawPath 方法来将路径绘制到指定的设备上。

简而言之,QPainterPath 用于描述和操作图形路径,而 QPainter 用于在设备上实际进行绘制。

QPainterPath

QPainterPath 是 Qt 中用于描述和操作绘图路径的强大类。路径是一系列直线、曲线和其他图元的集合,它定义了绘图的形状。QPainterPath 提供了丰富的方法来创建、操作和查询路径,使得在绘图中能够灵活而高效地构建各种形状。

创建 QPainterPath:

空路径和初始化:

通过 QPainterPath 的构造函数可以创建一个空的路径:

QPainterPath path;

也可以使用已有的路径进行初始化:

QPainterPath path1;
// 添加一些图元到 path1 中...

QPainterPath path2(path1);  // 使用 path1 初始化 path2

添加基本图元:

直线段:

path.lineTo(100, 100);  // 添加直线到 (100, 100)

曲线段:

二次贝塞尔曲线:
path.quadTo(50, 150, 100, 200);  // 添加二次贝塞尔曲线
三次贝塞尔曲线:
path.cubicTo(50, 150, 80, 180, 100, 200);  // 添加三次贝塞尔曲线
贝塞尔曲线

贝塞尔曲线是一种用于绘制平滑曲线的数学曲线。在二维图形中,贝塞尔曲线由起点、终点和一个或多个控制点定义。这些控制点的位置和数量决定了曲线的形状。

对于二次贝塞尔曲线,它有一个起点(P0)、一个终点(P2)和一个控制点(P1)。曲线上的点(B)由下面的方程给出:

[B(t) = (1 - t)^2 ⋅ P0 + 2 ⋅ (1 - t) ⋅ t ⋅ P1 + t^2 ⋅ P2]

其中:

  • (t) 是参数,取值范围为[0, 1],表示曲线上的位置。
  • (P0) 是起点的坐标。
  • (P1) 是控制点的坐标。
  • (P2) 是终点的坐标。

这个方程的含义是,曲线上的点 (B) 是通过对起点、控制点和终点进行加权求和得到的。(t) 的值在范围 ([0, 1]) 内变化,当 (t = 0) 时,(B) 在曲线的起点,当 (t = 1) 时,(B) 在曲线的终点。

QPainterPath path;
path.moveTo(0, 0);         // 起点
path.quadTo(50, 100, 100, 0);  // 二次贝塞尔曲线,控制点为 (50, 100),终点为 (100, 0)

在上面的例子中,quadTo 函数的两个参数为控制点的坐标。这个函数会在当前路径上添加一条二次贝塞尔曲线,起点为当前路径的最后一个点,终点为提供的参数,控制点为提供的参数。

圆弧:

path.arcTo(150, 150, 50, 50, 30, 120);  // 添加椭圆弧

操作路径:

在绘图中,路径(Path)是一系列直线、曲线等基本图元的集合,可以描述复杂的图形。QPainterPath 类提供了一组方法,允许你操作和使用这些路径。下面是关于路径操作和使用的详细讲解:

移动路径:

在绘制路径时,你可能需要从一个点移动到另一个点而不画线,这时就可以使用 moveTo 方法。

QPainterPath path;
path.moveTo(200, 200);  // 移动到 (200, 200),不画线

moveTo 将当前点移动到指定的坐标位置,而不会在路径上留下线段。

闭合路径:

闭合路径是将路径的当前子路径的最后一个点和起点相连接,形成一个封闭的图形。

QPainterPath path;
// 添加一些直线或曲线...
path.closeSubpath();  // 闭合当前子路径

closeSubpath 方法用于闭合当前子路径,将最后一个点和起点相连接。闭合路径在绘制时通常用于形成封闭的图形区域,例如多边形的填充。

使用路径进行绘制:

在使用 QPainter 进行绘图时,可以使用 drawPath 方法将路径绘制出来。

QPainter painter(this);
painter.drawPath(path);  // 绘制路径

drawPath 将路径上的图元绘制到画布上,可以是直线、曲线、圆弧等,取决于路径中包含的图元类型。这是将路径可视化的关键步骤,使你的路径成为可见的图形。

通过这些基本的路径操作和使用方法,可以创建和操作各种形状的路径,并在绘图中使用它们。这对于创建复杂的图形、图标等是非常有用的。

获取路径信息:

是否为空:

bool isEmpty = path.isEmpty();

是否包含指定点:

bool contains = path.contains(50, 50);

获取路径的矩形边界:

QRectF boundingRect = path.boundingRect();

获取路径的长度:

qreal length = path.length();

更高级的功能:

合并路径:

在图形操作中,有时候你可能需要将两个路径合并成一个。这就是使用 addPath 方法的时候,其中 path2 将被合并到 path1 中。

QPainterPath path1;
QPainterPath path2;
// 添加一些图元到 path1 和 path2 中...
path1.addPath(path2);  // 将 path2 合并到 path1

这样,path1 中将包含 path2 中所有的图元。

插入路径:

在路径中插入另一个路径,可以在路径的起始点或者其他位置插入。这通过 insert 方法来完成。

QPainterPath path1;
QPainterPath path2;
// 添加一些图元到 path2 中...
path1.insert(0, path2);  // 在 path1 的起始点插入 path2

这会将 path2 插入到 path1 的起始点,形成一个新的路径。

裁剪路径:

路径的裁剪是获取两个路径的交集部分。这在需要保留两个路径重叠部分时非常有用。

QPainterPath path1;
QPainterPath path2;
// 添加一些图元到 path1 和 path2 中...
path1 = path1.intersected(path2);  // path1 与 path2 的交集

path1 将包含仅为 path1path2 共有的部分。

路径的变换:

路径的变换允许你对路径进行平移、旋转、缩放等操作。这通过 QTransform 类来实现。

QPainterPath path1;
QPainterPath path2;
// 添加一些图元到 path2 中...
QTransform transform;
transform.rotate(45);  // 旋转变换
path1 = transform.map(path2);  // 将 path2 进行旋转

在这个例子中,path1 将包含对 path2 进行旋转后的图形。

这些路径操作提供了对路径更高级的控制,允许你在图形中更灵活地操作和组合不同的路径。

总结:

QPainterPath 是一个灵活且功能强大的类,它允许你构建复杂的图形路径并对其进行操作。通过组合基本的线段、曲线段和其他图元,你可以创建各种形状的路径。QPainterPath 在绘图和图形操作中被广泛用于 Qt 应用程序的开发中。

提示: 更多关于 QPainterPath 的详细信息,请参考[官方文档](QPainterPath Class | Qt GUI 5.12.12)。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值