在本页

QCanvasPath Class

QCanvasPath 是QCanvasPainter 的原生路径格式。更多...

头文件: #include <QCanvasPath>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
Qt 6.11
状态技术预览版

公共函数

QCanvasPath()
QCanvasPath(qsizetype commandsSize, qsizetype commandsDataSize = -1)
QCanvasPath(const QCanvasPath &path)
QCanvasPath(QCanvasPath &&other)
~QCanvasPath()
void addPath(const QCanvasPath &path, const QTransform &transform = QTransform())
void addPath(const QCanvasPath &path, qsizetype start, qsizetype count, const QTransform &transform = QTransform())
void arc(float centerX, float centerY, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = QCanvasPainter::PathWinding::ClockWise, QCanvasPainter::PathConnection connection = QCanvasPainter::PathConnection::Connected)
void arc(QPointF centerPoint, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = QCanvasPainter::PathWinding::ClockWise, QCanvasPainter::PathConnection connection = QCanvasPainter::PathConnection::Connected)
void arcTo(float x1, float y1, float x2, float y2, float radius)
void arcTo(QPointF point1, QPointF point2, float radius)
void beginHoleSubPath()
void beginSolidSubPath()
void bezierCurveTo(float cp1X, float cp1Y, float cp2X, float cp2Y, float x, float y)
void bezierCurveTo(QPointF controlPoint1, QPointF controlPoint2, QPointF endPoint)
void circle(float x, float y, float radius)
void circle(QPointF centerPoint, float radius)
void clear()
void closePath()
qsizetype commandsCapacity() const
qsizetype commandsDataCapacity() const
qsizetype commandsDataSize() const
qsizetype commandsSize() const
QPointF currentPosition() const
void ellipse(float x, float y, float radiusX, float radiusY)
void ellipse(const QRectF &rect)
bool isEmpty() const
void lineTo(QPointF point)
void lineTo(float x, float y)
void moveTo(QPointF point)
void moveTo(float x, float y)
QPointF positionAt(qsizetype index) const
void quadraticCurveTo(float cpX, float cpY, float x, float y)
void quadraticCurveTo(QPointF controlPoint, QPointF endPoint)
void rect(float x, float y, float width, float height)
void rect(const QRectF &rect)
void reserve(qsizetype commandsSize, qsizetype commandsDataSize)
void reserve(qsizetype commandsSize)
void roundRect(float x, float y, float width, float height, float radius)
void roundRect(float x, float y, float width, float height, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void roundRect(const QRectF &rect, float radius)
void roundRect(const QRectF &rect, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void setPathWinding(QCanvasPainter::PathWinding winding)
QCanvasPath sliced(qsizetype start, qsizetype count, const QTransform &transform = QTransform()) const
void squeeze()
void swap(QCanvasPath &other)
operator QVariant() const
QCanvasPath &operator=(QCanvasPath &&other)
QCanvasPath &operator=(const QCanvasPath &path)
bool operator!=(const QCanvasPath &lhs, const QCanvasPath &rhs)
bool operator==(const QCanvasPath &lhs, const QCanvasPath &rhs)

详细描述

绘制路径是一个由矩形、椭圆、直线和曲线等图形构件组成的对象。QCanvasPath API 与QCanvasPainter 路径绘制相匹配,可轻松在直接绘制或绘制到路径之间调整代码。使用 QCanvasPath 的主要原因是避免重新创建(静态)路径,并能缓存路径的 GPU 缓冲区。

QPainterPath 相比,QCanvasPath 对渲染进行了更多优化,但比较或调整路径的功能较少。特别是

  • 没有用于两条路径相交或相减的方法。
  • 没有翻译路径的方法。
  • 没有添加文本的方法。
  • 填充规则总是WindingFill (非零),不支持OddEvenFill

从功能上看,QCanvasPath 与 HTML CanvasPath2D 更为相似,只是增加了一些功能,API 与QCanvasPainter 匹配。

路径组和缓存

通过 QCanvasPath 绘制路径可让引擎缓存路径几何图形(顶点)。这将提高静态路径的性能,同时可能增加 GPU 内存消耗。

当使用以QCanvasPath 作为参数的fill() 或stroke() 绘制路径时,可以将pathGroup 设置为第二个参数。这定义了缓存路径的 GPU 缓冲区。默认情况下,pathGroup0 ,即使用第一个缓冲区。将pathGroup 设置为-1 意味着路径不分配自己的缓冲区,而是使用与直接绘制相同的动态缓冲区,即使用 beginPath() 之后的命令和填充/描边。

将路径排列成路径组可以有效优化渲染性能和 GPU 内存使用量。为了优化缓冲区的使用,属于同一组且经常同时发生变化的路径应放在同一组中。

当路径发生变化时,其几何图形(顶点缓冲区)会自动更新。导致路径组几何图形更新的情况有

请注意,更改状态变换(QCanvasPainter::transform(),QCanvasPainter::rotate() 等)不会使路径失效,因此移动/缩放/旋转缓存路径非常有效。

如果不再需要绘制路径,或者应用程序需要释放 GPU 内存,可以通过调用QCanvasPainter::removePathGroup() 来释放缓存。通常不需要这样做,因为缓存路径会在绘制器析构过程中自动释放。

另请参阅 QCanvasPainter::addPath() 和QCanvasPainter::removePathGroup()。

成员函数文档

QCanvasPath::QCanvasPath()

构造一个空路径。

[explicit] QCanvasPath::QCanvasPath(qsizetype commandsSize, qsizetype commandsDataSize = -1)

构造一个空路径,为commandsSize 命令量和可选的commandsDataSize 数据量分配空间。如果未给出commandsDataSize 参数,则会自动为2 * commandsSize 的数据量预留空间,当路径命令为直线(moveTo(),lineTo(),rect() )时,这是最佳的数据量。

预留正确的空间是对路径创建和内存使用的优化。它不是强制性的,因为在向路径添加命令时会自动确保足够的空间。

另请参见 reserve()。

QCanvasPath::QCanvasPath(const QCanvasPath &path)

构造一个路径,它是给定path 的副本。

QCanvasPath::QCanvasPath(QCanvasPath &&other)

移动-从other 构建一个新的 QCanvasPath。

[noexcept] QCanvasPath::~QCanvasPath()

摧毁路径

void QCanvasPath::addPath(const QCanvasPath &path, const QTransform &transform = QTransform())

path 添加到此路径中,可选择使用transform 更改路径点。如果没有提供transform (或它是标识矩阵),此操作会非常快,因为它会重复使用路径数据。

void QCanvasPath::addPath(const QCanvasPath &path, qsizetype start, qsizetype count, const QTransform &transform = QTransform())

path 添加到当前路径,从start 的命令开始,包括count 的命令量。可选择使用transform 更改路径点。会检查startcount 的范围,以确保命令的访问量不会超过QCanvasPath::commandsSize()。如果路径不应该从当前路径位置继续,则首先调用moveTo() 和path.positionAt(start - 1)

void QCanvasPath::arc(float centerX, float centerY, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = QCanvasPainter::PathWinding::ClockWise, QCanvasPainter::PathConnection connection = QCanvasPainter::PathConnection::Connected)

QPointF(centerX,centerY) 为圆心,以给定的radius 为圆心,以a0 弧度角为起点,以a1 弧度角为终点,创建一条弧。弧线跨越给定的direction 。当connectionNotConnected 时,之前的路径关闭,并开始新的子路径。

void QCanvasPath::arc(QPointF centerPoint, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = QCanvasPainter::PathWinding::ClockWise, QCanvasPainter::PathConnection connection = QCanvasPainter::PathConnection::Connected)

以给定的radius 为中心,创建一条以a0 弧度为起点、以a1 弧度为终点、以centerPoint 为中心的弧线。弧线跨越给定的direction 。当connectionNotConnected 时,前一条路径被关闭,并开始一条新的子路径。

这是一个重载函数。

void QCanvasPath::arcTo(float x1, float y1, float x2, float y2, float radius)

使用点QPointF(x1,y1) 和QPointF(x2,y2) 与给定的radius 创建一条弧。

void QCanvasPath::arcTo(QPointF point1, QPointF point2, float radius)

使用点point1point2 以及给定的radius 创建一条弧。

这是一个重载函数。

void QCanvasPath::beginHoleSubPath()

启动孔子路径。这等同于setPathWinding(QCanvasPainter::PathWinding::ClockWise))

另请参见 beginSolidSubPath().

void QCanvasPath::beginSolidSubPath()

启动实心子路径。这等同于setPathWinding(QCanvasPainter::PathWinding::CounterClockWise))

另请参见 beginHoleSubPath().

void QCanvasPath::bezierCurveTo(float cp1X, float cp1Y, float cp2X, float cp2Y, float x, float y)

使用cp1X,cp1Y,cp2Xcp2Y 指定的控制点,在当前位置与xy 指定的终点之间添加一条立方贝塞尔曲线。

曲线添加完成后,当前位置将更新为曲线的终点。

void QCanvasPath::bezierCurveTo(QPointF controlPoint1, QPointF controlPoint2, QPointF endPoint)

使用controlPoint1, 和controlPoint2 指定的控制点,在当前位置和给定的endPoint 之间添加一条立方贝塞尔曲线。

曲线添加完成后,当前位置将更新为曲线的终点。

这是一个重载函数。

void QCanvasPath::circle(float x, float y, float radius)

将圆心位于QPointF(x,y) 和给定的radius 的圆添加到路径中。

void QCanvasPath::circle(QPointF centerPoint, float radius)

将圆心位于centerPoint 且给定值为radius 的圆添加到路径中。

这是一个重载函数。

void QCanvasPath::clear()

清除路径命令和数据。

当路径命令发生变化时调用此命令以重新创建路径。这不会影响内存使用,请使用reserve() 和squeeze() 来处理。

另请参阅 reserve() 和squeeze()。

void QCanvasPath::closePath()

在子路径的起点画一条线,关闭当前子路径,自动开始一条新路径。

qsizetype QCanvasPath::commandsCapacity() const

返回路径中命令的容量。

另请参阅 commandsDataCapacity() 和reserve()。

qsizetype QCanvasPath::commandsDataCapacity() const

返回路径中命令数据的容量。

另请参阅 commandsCapacity() 和reserve()。

qsizetype QCanvasPath::commandsDataSize() const

返回路径中命令数据的数量。

命令数据主要指命令所需的点。

注意: 某些路径元素需要多个数据点。例如,closePath 需要0moveTolineTo 需要2bezierCurveTo 需要 6 个数据点,roundRect 需要34 数据点。

qsizetype QCanvasPath::commandsSize() const

返回路径中命令的数量。

注意: 某些路径元素需要多个命令。例如,moveTolineTo 需要1 命令,bezierCurveTo 需要6 命令,roundRect 10 命令。

QPointF QCanvasPath::currentPosition() const

返回路径的当前位置。这意味着前一个路径命令(moveTo,lineTo,bezierCurveTo 等)结束的位置。如果路径为空,则返回 (0.0, 0.0)。

void QCanvasPath::ellipse(float x, float y, float radiusX, float radiusY)

创建一个以 (x,y) 为中心、半径由radiusX,radiusY 定义的椭圆,并将其作为封闭子路径添加到路径中。

void QCanvasPath::ellipse(const QRectF &rect)

在矩形rect 中创建一个椭圆,并将其作为封闭子路径添加到路径中。

这是一个重载函数。

bool QCanvasPath::isEmpty() const

当路径为空时返回 true。

另请参见 clear

void QCanvasPath::lineTo(QPointF point)

从当前位置向给定的point 添加一条直线。直线绘制完成后,当前位置将更新为直线的终点。

这是一个重载函数。

void QCanvasPath::lineTo(float x, float y)

从当前位置到点 (x,y) 画一条直线。

这是一个重载函数。

void QCanvasPath::moveTo(QPointF point)

将当前点移动到给定的point ,隐式启动一个新的子路径并关闭前一个子路径。

这是一个重载函数。

void QCanvasPath::moveTo(float x, float y)

将当前位置移动到 (x,y) 并启动一个新的子路径,同时隐式关闭前一个路径。

这是一个重载函数。

QPointF QCanvasPath::positionAt(qsizetype index) const

返回路径在index 的位置。这意味着路径命令(moveTo,lineTo,bezierCurveTo 等)在index 的位置。索引必须在0commandsSize() - 1 之间。如果路径为空,则返回 (0.0, 0.0)。

void QCanvasPath::quadraticCurveTo(float cpX, float cpY, float x, float y)

在当前点和端点 (x,y) 之间添加一条二次贝塞尔曲线,控制点由 (cpX,cpY) 指定。

void QCanvasPath::quadraticCurveTo(QPointF controlPoint, QPointF endPoint)

在当前位置和给定的endPoint 之间添加一条二次贝塞尔曲线,控制点由controlPoint 指定。

这是一个重载函数。

void QCanvasPath::rect(float x, float y, float width, float height)

用给定的widthheight 创建一个矩形,其位置为QPointF(x,y) 。

void QCanvasPath::rect(const QRectF &rect)

创建一个由rect

指定的矩形。

void QCanvasPath::reserve(qsizetype commandsSize, qsizetype commandsDataSize)

QCanvasPath 的内部内存中预留一定的空间。

尝试至少为commandsSize 命令和commandsDataSize 数据点分配内存。某些路径元素需要多个命令,请参见commandsSize() 和commandsDataSize()。

预留正确空间是对路径创建和内存使用的优化。它不是强制性的,因为在向路径中添加命令时会自动确保足够的空间。

另请参见 squeeze()、commandsCapacity() 和commandsDataCapacity()。

void QCanvasPath::reserve(qsizetype commandsSize)

QCanvasPath 的内部存储器中保留一定的空间。

尝试为至少commandsSize 命令分配内存。某些路径元素需要多条命令,请参见commandsSize() 和commandsDataSize()。

会自动为2 * commandsSize 的数据量预留空间,当路径命令为直线(moveTo(),lineTo(),rect() )时,这是最佳的数据量。

预留正确的空间是对路径创建和内存使用的优化。它不是强制性的,因为在向路径中添加命令时会自动确保足够的空间。

这是一个重载函数。

另请参见 squeeze()、commandsCapacity() 和commandsDataCapacity()。

void QCanvasPath::roundRect(float x, float y, float width, float height, float radius)

将给定的带圆角的矩形x,y,width,height 添加到路径中。圆角是四分之一圆,其给定值为radius

void QCanvasPath::roundRect(float x, float y, float width, float height, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)

将带圆角的矩形x,y,width,height 添加到路径中。圆角是半径分别为radiusTopLeft,radiusTopRight radiusBottomRightradiusBottomLeft 的四分之一圆。

void QCanvasPath::roundRect(const QRectF &rect, float radius)

将给定的带圆角的矩形rect 添加到路径中。圆角是四分之一圆,其给定值为radius

这是一个重载函数。

void QCanvasPath::roundRect(const QRectF &rect, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)

将带有圆角的矩形rect 添加到路径中。圆角是半径分别为radiusTopLeft,radiusTopRight radiusBottomRightradiusBottomLeft 的四分之一圆。

这是一个重载函数。

void QCanvasPath::setPathWinding(QCanvasPainter::PathWinding winding)

将当前子路径winding 设置为QCanvasPainter::CounterClockWise (默认)或QCanvasPainter::ClockWise 。CounterClockWise 绘制实心子路径,而 ClockWise 绘制空心子路径。

注意: 这是一条命令,与lineTomoveTo 等命令类似,因此应先设置绕组,然后再执行更改绕组的其他命令。

QCanvasPath QCanvasPath::sliced(qsizetype start, qsizetype count, const QTransform &transform = QTransform()) const

返回一个新路径,其中包含该路径中的命令,从start 的命令开始,包括count 的命令量,也可选择使用transform 更改路径点。

将检查startcount 的范围,以确保命令的访问量不超过commandsSize()。如果start 处的命令不是MoveTo ,则第一条命令将被替换为MoveTo ,这样这个片段就是一个单独的路径。

void QCanvasPath::squeeze()

释放存储路径命令和数据所不需要的内存。调用reserve() 后,可用于减少内存使用量。

通常情况下不需要使用此功能,但当由于预留或添加了许多元素(lineTobezierCurveTo 等)而导致路径大小变大,并且预计将来路径大小会小得多时,调用reserve()squeeze() 将释放一些内存。

另请参见 reserve().

[noexcept] void QCanvasPath::swap(QCanvasPath &other)

将此路径与other 互换。该操作速度非常快,从未出现过故障。

QCanvasPath::operator QVariant() const

QVariant 的形式返回路径。

[noexcept] QCanvasPath &QCanvasPath::operator=(QCanvasPath &&other)

Move-assignsother 到此QCanvasPath 实例。

QCanvasPath &QCanvasPath::operator=(const QCanvasPath &path)

将给定的path 分配给此路径,并返回此路径的引用。

相关非成员

[noexcept] bool operator!=(const QCanvasPath &lhs, const QCanvasPath &rhs)

如果路径lhsrhs 不同,则返回true ;否则返回false

另请参见 operator==().

[noexcept] bool operator==(const QCanvasPath &lhs, const QCanvasPath &rhs)

如果路径lhs 等于rhs ,则返回true ;否则返回false

另请参阅 operator!=().

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.