Qt 绘图QPainterPath < 三 >
QPainterPath 对象可用于填充、勾勒和裁剪。与普通绘图操作相比,绘制路径的主要优势在于,复杂的形状只需要创建一次;然后只需调用QPainter::drawPath()函数就可以多次绘制它们。
QPainterPath提供了一组函数,可用于获取路径及其元素的信息。此外,还可以使用toReversed函数反转元素的顺序。还有几个函数可以将这个画家路径对象转换为多边形表示。
文章目录
QPainterPath与 QPainter
QPainterPath
和 QPainter
是 Qt 中用于绘图的两个关键类,它们之间有密切的关系。
QPainterPath
: 是一个用于描述和操作绘图路径的类。路径(Path)是一系列的直线段、曲线段和其他图元的集合,它定义了绘图的形状。QPainterPath
可以用于构建和操作复杂的图形路径,包括直线、曲线、圆弧等。它提供了一系列的方法来添加、移动、合并、裁剪等操作,以便创建和处理图形路径。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
将包含仅为 path1
和 path2
共有的部分。
路径的变换:
路径的变换允许你对路径进行平移、旋转、缩放等操作。这通过 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)。