在本页

QCanvasPainter Class

QCanvasPainter 类在QRhi 上执行硬件加速绘画。更多

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

公共类型

enum class CompositeOperation { SourceOver, SourceAtop, DestinationOut }
enum class ImageFlag { GenerateMipmaps, RepeatX, RepeatY, Repeat, FlipY, …, NativeTexture }
flags ImageFlags
enum class LineCap { Butt, Round, Square }
enum class LineJoin { Round, Bevel, Miter }
enum class PathConnection { NotConnected, Connected }
enum class PathWinding { CounterClockWise, ClockWise }
enum class RenderHint { Antialiasing, HighQualityStroking, DisableWindingEnforce }
flags RenderHints
enum class TextAlign { Left, Right, Center, Start, End }
enum class TextBaseline { Top, Hanging, Middle, Alphabetic, Bottom }
enum class TextDirection { LeftToRight, RightToLeft, Inherit, Auto }
enum class WrapMode { NoWrap, Wrap, WordWrap, WrapAnywhere }

公共函数

QCanvasPainter()
~QCanvasPainter()
qsizetype activeImageCount() const
qsizetype activeImageMemoryUsage() const
QCanvasImage addImage(const QImage &image, QCanvasPainter::ImageFlags flags = {})
QCanvasImage addImage(QRhiTexture *texture, QCanvasPainter::ImageFlags flags = {})
QCanvasImage addImage(const QCanvasOffscreenCanvas &canvas, QCanvasPainter::ImageFlags flags = {})
void addPath(const QPainterPath &path)
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 = PathWinding::ClockWise, QCanvasPainter::PathConnection connection = PathConnection::Connected)
void arc(QPointF centerPoint, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = PathWinding::ClockWise, QCanvasPainter::PathConnection connection = PathConnection::Connected)
void arcTo(float x1, float y1, float x2, float y2, float radius)
void arcTo(QPointF controlPoint1, QPointF controlPoint2, float radius)
void beginHoleSubPath()
void beginPath()
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 centerX, float centerY, float radius)
void circle(QPointF centerPoint, float radius)
void cleanupResources()
void clearRect(float x, float y, float width, float height)
void clearRect(const QRectF &rect)
void closePath()
QCanvasOffscreenCanvas createCanvas(QSize pixelSize, int sampleCount = 1, QCanvasOffscreenCanvas::Flags flags = {})
void destroyCanvas(QCanvasOffscreenCanvas &canvas)
float devicePixelRatio() const
void drawBoxShadow(const QCanvasBoxShadow &shadow)
void drawImage(const QCanvasImage &image, float x, float y)
void drawImage(const QCanvasImage &image, const QRectF &destinationRect)
void drawImage(const QCanvasImage &image, const QRectF &sourceRect, const QRectF &destinationRect)
void drawImage(const QCanvasImage &image, float x, float y, float width, float height)
void ellipse(float centerX, float centerY, float radiusX, float radiusY)
void ellipse(const QRectF &rect)
void ellipse(QPointF centerPoint, float radiusX, float radiusY)
void fill()
void fill(const QCanvasPath &path, int pathGroup = 0)
void fillRect(float x, float y, float width, float height)
void fillRect(const QRectF &rect)
void fillText(const QString &text, float x, float y, float maxWidth = -1)
void fillText(const QString &text, const QRectF &rect)
void fillText(const QString &text, QPointF point, float maxWidth = -1)
QTransform getTransform() const
void lineTo(float x, float y)
void lineTo(QPointF point)
void moveTo(float x, float y)
void moveTo(QPointF point)
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 removeImage(const QCanvasImage &image)
void removePathGroup(int pathGroup)
QCanvasPainter::RenderHints renderHints() const
void reset()
void resetClipping()
void resetTransform()
void restore()
void rotate(float angle)
void roundRect(float x, float y, float width, float height, float radius)
void roundRect(const QRectF &rect, float radius)
void roundRect(const QRectF &rect, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void roundRect(float x, float y, float width, float height, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void save()
void scale(float scale)
void scale(float scaleX, float scaleY)
void setAntialias(float antialias)
void setBrushTransform(const QTransform &transform)
void setClipRect(float x, float y, float width, float height)
void setClipRect(const QRectF &rect)
void setFillStyle(const QColor &color)
void setFillStyle(const QCanvasBrush &brush)
void setFont(const QFont &font)
void setGlobalAlpha(float alpha)
void setGlobalBrightness(float value)
void setGlobalCompositeOperation(QCanvasPainter::CompositeOperation operation)
void setGlobalContrast(float value)
void setGlobalSaturate(float value)
void setLineCap(QCanvasPainter::LineCap cap)
void setLineJoin(QCanvasPainter::LineJoin join)
void setLineWidth(float width)
void setMiterLimit(float limit)
void setPathWinding(QCanvasPainter::PathWinding winding)
void setRenderHint(QCanvasPainter::RenderHint hint, bool on = true)
void setRenderHints(QCanvasPainter::RenderHints hints, bool on = true)
void setStrokeStyle(const QColor &color)
void setStrokeStyle(const QCanvasBrush &brush)
void setTextAlign(QCanvasPainter::TextAlign align)
void setTextAntialias(float antialias)
void setTextBaseline(QCanvasPainter::TextBaseline baseline)
void setTextDirection(QCanvasPainter::TextDirection direction)
void setTextLineHeight(float height)
void setTextWrapMode(QCanvasPainter::WrapMode wrapMode)
void setTransform(const QTransform &transform)
void skew(float angleX, float angleY = 0.0f)
void stroke()
void stroke(const QCanvasPath &path, int pathGroup = 0)
void strokeRect(float x, float y, float width, float height)
void strokeRect(const QRectF &rect)
QRectF textBoundingBox(const QString &text, float x, float y, float maxWidth = -1)
QRectF textBoundingBox(const QString &text, const QRectF &rect)
QRectF textBoundingBox(const QString &text, QPointF point, float maxWidth = -1)
void transform(const QTransform &transform)
void translate(float x, float y)
void translate(QPointF point)

静态公共成员

float mmToPx(float mm)
float ptToPx(float pt)

详细说明

Qt Canvas Painter (QCanvasPainter) 提供为硬件加速(GPU)绘画而优化的绘画 API。该 API 严格遵循 HTML Canvas 2D Context 规范,并已移植到 Qt C++。它还受到QPainter 的影响,但 API 更为简洁。

下面是一个使用 QCanvasPainter 创建圆形按钮的简单示例。

QRectF rect(40, 70, 120, 60);
QRectF shadowRect = rect.translated(2, 4);
// Paint shadow
QCanvasBoxShadow shadow(shadowRect, 30, 15, "#60373F26");
p->drawBoxShadow(shadow);
// Paint rounded rect
p->beginPath();
p->roundRect(rect, 30);
p->setFillStyle("#DBEB00");
p->fill();
// Paint text
p->setTextAlign(QCanvasPainter::TextAlign::Center);
p->setTextBaseline(QCanvasPainter::TextBaseline::Middle);
QFont font("Titillium Web", 18);
p->setFont(font);
p->setFillStyle("#373F26");
p->fillText("CLICK!", rect);

下面是另一个绘制简单图形的示例。

// Paint grid
QCanvasGridPattern grid(0, 0, 10, 10, "#404040", "#202020");
p->setFillStyle(grid);
p->fillRect(0, 0, width(), height());
// Paint axis
p->setFillStyle(QColorConstants::White);
p->fillRect(0, 0.5 * height() - 1, width(), 2);
p->fillRect(0.5 * width() - 1, 0, 2, height());
// Paint shadowed graph
p->beginPath();
p->moveTo(20, height() * 0.8);
p->bezierCurveTo(width() * 0.2, height() * 0.4,
                 width() * 0.5, height() * 0.8,
                 width() - 20, height() * 0.2);
p->setAntialias(10);
p->setLineWidth(12);
p->setStrokeStyle("#D0000000");
p->stroke();
p->setAntialias(1);
p->setLineWidth(6);
QCanvasLinearGradient lg(0, 0, 0, height());
lg.setStartColor(QColorConstants::Red);
lg.setEndColor(QColorConstants::Green);
p->setStrokeStyle(lg);
p->stroke();

功能特点

从命名的角度来看,QCanvasPainter 的大部分功能都紧跟 HTML Canvas 2D Context (https://html.spec.whatwg.org/multipage/canvas.html#2dcontext)。这使得许多开发人员都能熟悉使用 API,并能轻松重用现有的画布代码。但我们的目标并不是与 HTML 画布 100% 兼容。QCanvasPainter 缺少了一些功能,以使其更简单,在QRhi 硬件加速图形 API 上性能更强,并能更好地满足现代 UI 需求。由于这些原因,QCanvasPainter 与 HTML 画布 2D 上下文相比还具有更多的功能。

这些是我们目前至少比 HTML 画布缺少的一些功能:

  • 剪切:所有剪切都是(转换的)矩形,不支持剪切到路径形状。
  • 填充模式:只支持默认的非零填充模式,不支持偶数填充模式。
  • 破折号:笔画始终为实线,不支持虚线/点状笔画模式。
  • 路径测试:没有 isPointInPath() 或 isPointInStroke() 方法。
  • 文本描边:不支持文本轮廓描边。
  • 滤镜:不支持画布 SVG 滤镜效果。
  • 复合模式:复合模式的数量限制为 3,可以在不渲染到额外缓冲区的情况下支持。
  • 阴影:不支持内置阴影方法。

另一方面,与 HTML 画布相比,QCanvasPainter 提供的一些附加功能包括

  • 路径组:QCanvasPainter 允许绘制静态路径,并将这些路径缓存为组,以优化 GPU 的使用。
  • 可调节的抗锯齿:由于采用了路径顶点抗锯齿和 SDF 文本渲染,因此可以自由调整抗锯齿的像素数量,使绘画更加平滑。
  • 方框渐变:除了线性、径向和锥形渐变外,QCanvasPainter 还支持圆角矩形框渐变。
  • 方框阴影QCanvasPainter 还支持 CSS 方框阴影类型的画笔。渲染使用 SDF 方法,类似于Qt Quick RectangularShadow ,因此性能非常高。
  • 网格模式:QCanvasPainter 支持QCanvasGridPattern 动态网格和条形图案样式。
  • 自定义画笔:QCanvasPainter 还允许使用自定义顶点和片段着色器进行填充和描边 (QCanvasCustomBrush)。这些自定义笔刷也可用于文本。
  • 文字包装:QCanvasPainter 支持将文本自动包装成多行,并提供不同的包装模式。
  • 色彩效果除 globalAlpha 外,QCanvasPainter 还支持全局亮度、对比度和饱和度。
  • 着色图像QCanvasPainter 为绘制的图像和图像图案添加了着色支持。

QCanvasPainter 与体系结构无关,可用于Qt QuickQt Widgets 应用程序。实际上,即使没有这两个应用程序,只需使用QWindowQRhi 也可以使用它。要使用 QCanvasPainter,请根据应用程序的体系结构,从这些类中选择一个使用它:

填充规则

QCanvasPainter 使用nonzero (WindingFill) 填充规则。要根据路径点方向选择填充,可通过setRenderHint() 设置DisableWindingEnforce 渲染提示来禁用缠绕强制。

p->setRenderHint(QCanvasPainter::RenderHint::DisableWindingEnforce);
p->beginPath();
// Outer shape, counterclockwise
p->moveTo(20, 20);
p->lineTo(100, 180);
p->lineTo(180, 20);
p->closePath();
// Inner shape, clockwise
p->moveTo(100, 40);
p->lineTo(125, 90);
p->lineTo(75, 90);
p->closePath();
p->fill();
p->stroke();

不过,更常见的情况是使用setPathWinding() 或beginHoleSubPath() 和beginSolidSubPath() 助手强制卷绕并设置首选卷绕。

p->beginPath();
p->roundRect(20, 20, 160, 160, 30);
// Start painting holes
p->beginHoleSubPath();
p->roundRect(40, 40, 120, 120, 10);
// Start painting solid
p->beginSolidSubPath();
p->rect(60, 60, 80, 20);
p->circle(100, 120, 20);
p->fill();
p->stroke();

成员类型文档

enum class QCanvasPainter::CompositeOperation

Qt 画布绘制器支持 3 种复合操作:

常量说明
QCanvasPainter::CompositeOperation::SourceOver0默认值。在现有内容的顶部绘制新形状。
QCanvasPainter::CompositeOperation::SourceAtop1新形状只在与现有内容重叠的地方绘制。
QCanvasPainter::CompositeOperation::DestinationOut2现有内容将保留在与新形状不重叠的地方。

另请参阅 setGlobalCompositeOperation().

枚举类 QCanvasPainter::ImageFlag
flags QCanvasPainter::ImageFlags

该枚举用于指定与图像相关的标志。与addImage() 一起使用可设置标志。

常量说明
QCanvasPainter::ImageFlag::GenerateMipmaps1 << 0设置此项可为图像生成 mipmaps。当缩放后的图像小于原始尺寸,需要更平滑的输出时,应使用 mipmaps。
QCanvasPainter::ImageFlag::RepeatX1 << 1与图像图案一起使用可在 X 坐标上重复图像。
QCanvasPainter::ImageFlag::RepeatY1 << 2与图像图案一起使用可在 Y 坐标上重复图像。
QCanvasPainter::ImageFlag::RepeatRepeatX | RepeatY与图像图案一起使用可在两个坐标上重复图像。
QCanvasPainter::ImageFlag::FlipY1 << 3渲染时在 Y 方向翻转(反转)图像。
QCanvasPainter::ImageFlag::Premultiplied1 << 4图像数据具有预乘法 alpha。
QCanvasPainter::ImageFlag::Nearest1 << 5图像插值是最近插值,而不是线性插值
QCanvasPainter::ImageFlag::NativeTexture1 << 6表示这是QCanvasPainter 以外的纹理。

ImageFlags 类型是QFlags<ImageFlag> 的类型定义。它存储 ImageFlag 值的 OR 组合。

enum class QCanvasPainter::LineCap

LineCap 用于定义如何绘制线条的末端(盖)。

常数说明
QCanvasPainter::LineCap::Butt0(默认)不覆盖线条端点的方形线条结尾。
QCanvasPainter::LineCap::Round1圆形线尾。
QCanvasPainter::LineCap::Square2方形线尾,覆盖端点并超出一半线宽。

另请参阅 setLineCap()。

enum class QCanvasPainter::LineJoin

LineJoin 用于定义如何绘制两条相连直线之间的连接线。

常数说明
QCanvasPainter::LineJoin::Round0填充两条直线之间的圆弧。
QCanvasPainter::LineJoin::Bevel1填充两条直线之间的三角形凹槽。
QCanvasPainter::LineJoin::Miter2(默认情况下)两条直线的外边缘延伸至一个角度相交,该区域被填充。

另请参阅 setLineJoin() 和setMiterLimit()。

enum class QCanvasPainter::PathConnection

在某些绘制方法中,PathConnection 用于指定新路径是否应连接到上一条路径的最后一点。

常数说明
QCanvasPainter::PathConnection::NotConnected0从上一条路径的最后一点到当前路径的第一点之间没有连线。
QCanvasPainter::PathConnection::Connected1前一条路径的最后一点将连接到当前路径的第一点。

另请参见 arc()。

enum class QCanvasPainter::PathWinding

PathWinding 用于指定路径绘制的方向。该方向用于确定路径中的子路径是实心还是空心。

常数说明
QCanvasPainter::PathWinding::CounterClockWise0(默认) 实体为逆时针方向。
QCanvasPainter::PathWinding::ClockWise1顺时针旋转用于孔。

另请参阅 setPathWinding().

枚举类 QCanvasPainter::RenderHint
flags QCanvasPainter::RenderHints

此枚举指定了与渲染相关的标志,用于QCanvasPainter 。使用setRenderHint() 设置标志。

常量说明
QCanvasPainter::RenderHint::Antialiasing1 << 0将此值设为 false 会禁用抗锯齿。启用抗锯齿会导致更高的渲染成本。默认值为 true。
QCanvasPainter::RenderHint::HighQualityStroking1 << 1将此值设为 true,在一些不常见的情况下,即描边重叠且不完全不透明时,可以获得更正确的渲染效果。启用该选项会导致更高的渲染成本。默认值为 false。
QCanvasPainter::RenderHint::DisableWindingEnforce1 << 2将此项设置为 true 后,将无法强制路径卷绕与setPathWinding() 中的设置相匹配。禁用后,可以按时钟顺序添加点,从而在路径上创建孔洞。禁用还可以提高性能。

RenderHints 类型是QFlags<RenderHint> 的类型定义。它存储 RenderHint 值的 OR 组合。

enum class QCanvasPainter::TextAlign

TextAlign 用于定义文本的水平对齐方式。

常数说明
QCanvasPainter::TextAlign::Left0将文本左侧水平对齐到指定位置。
QCanvasPainter::TextAlign::Right1将文本右侧水平对齐到指定位置。
QCanvasPainter::TextAlign::Center2将文本中心水平对齐到指定位置。
QCanvasPainter::TextAlign::Start3(默认)文本在行的正常起始位置对齐(从左到右的本地环境为左对齐,从右到左的本地环境为右对齐)。
QCanvasPainter::TextAlign::End4文本以正常的行尾对齐(从左到右的本地语言为右对齐,从右到左的本地语言为左对齐)。

另请参阅 setTextAlign()、setTextDirection() 和fillText()。

enum class QCanvasPainter::TextBaseline

TextBaseline 用于定义文本的垂直对齐(基线)方式。

常数说明
QCanvasPainter::TextBaseline::Top0将文本顶部垂直对齐到指定位置。
QCanvasPainter::TextBaseline::Hanging1将文本的悬挂基线垂直对齐到指定位置。
QCanvasPainter::TextBaseline::Middle2将文本中间部分垂直对齐到指定位置。
QCanvasPainter::TextBaseline::Alphabetic3(默认)将文本的基线垂直对齐到指定位置。
QCanvasPainter::TextBaseline::Bottom4将文本底部垂直对齐到指定位置。

另请参阅 setTextBaseline() 和fillText()。

enum class QCanvasPainter::TextDirection

TextDirection 用于定义文本的水平对齐方式。

常数说明
QCanvasPainter::TextDirection::LeftToRight0文本方向为从左到右。
QCanvasPainter::TextDirection::RightToLeft1文本方向为从右到左。
QCanvasPainter::TextDirection::Inherit2(默认)文本方向继承自QGuiApplication layoutDirection。请参阅 https://doc.qt.io/qt-6/qguiapplication.html#layoutDirection-prop。
QCanvasPainter::TextDirection::Auto3文本方向根据文本字符串自动检测。请参见QString::isRightToLeft().

注意: 由于这需要分析文本,因此可能比其他选项慢。

另请参见 setTextDirection()、setTextAlign() 和fillText()。

enum class QCanvasPainter::WrapMode

WrapMode 用于定义如何将文本换行到多行。

常数说明
QCanvasPainter::WrapMode::NoWrap0(默认)不进行换行。如果文本中换行不够,那么 contentWidth 将超过设定的宽度。
QCanvasPainter::WrapMode::Wrap1如果可能,将在单词边界进行换行;否则,将在行上的适当位置进行换行,即使是在单词中间。
QCanvasPainter::WrapMode::WordWrap2换行仅在单词边界进行。如果单词过长,内容宽度将超过设定宽度。
QCanvasPainter::WrapMode::WrapAnywhere3在行的任何一点都可以进行换行,即使换行发生在单词中间。

另请参阅 setTextWrapMode() 和fillText()。

成员函数文档

QCanvasPainter::QCanvasPainter()

构建一个画家。

[noexcept] QCanvasPainter::~QCanvasPainter()

摧毁画家

qsizetype QCanvasPainter::activeImageCount() const

返回在此QCanvasPainter 注册的活动QCanvasImage 对象的数量。这也包括gradients 的内部创建图像。

QCanvasImage 本函数不考虑通过注册QCanvasOffscreenCanvas 实例或外部管理纹理创建的对象。

另请参阅 activeImageMemoryUsage()、addImage() 和removeImage()。

qsizetype QCanvasPainter::activeImageMemoryUsage() const

返回通过addImage() 重载创建的该画家的所有活动QCanvasImage 实例的图像(像素)数据所使用内存的近似值(以千字节为单位),这些数据是通过QImage 创建的。它还包括gradients 内部创建的图像数据。

QCanvasPainteraddImage() 返回后,该函数不会保留 CPU 端QImage 数据的副本。因此,该函数的结果是用于纹理的 GPU 内存的近似值。

注意: 该值只是基于图像格式和尺寸的估计值。Qt 不知道纹理数据在 GPU 端内存中是如何存储和布局的。

此函数不考虑通过其他addImage() 重载注册的屏幕外画布和外部管理的纹理。

对于每个有效的QCanvasImage ,都可以通过调用sizeInBytes() 来查询以字节为单位的单独大小。如果QCanvasImage 是由QCanvasOffscreenCanvasQRhiTexture 创建的,该函数也会返回有效结果,但它不考虑 mipmap 或多采样数据。

另请参见 activeImageCount()、addImage() 和removeImage()。

QCanvasImage QCanvasPainter::addImage(const QImage &image, QCanvasPainter::ImageFlags flags = {})

imageflags 添加为绘画者可用的纹理。返回带有纹理 ID 和其他图像信息的QCanvasImage 。返回的QCanvasImage 可与drawImageQCanvasImagePattern 一起使用。调用此方法后,image QImage 无需保留在内存中。

使用相同的image 进行调用是一种廉价操作,因为预计会有缓存命中。

优化时必须注意只调用一次 addImage()。这并不总是足够的,这取决于应用程序的设计。例如,如果底层图形资源丢失,如由于将部件移动到新的顶层,导致画图器与新的QRhi 相关联,那么调用该函数对于从image 重新创建本地图形纹理至关重要。

另请参阅 drawImage() 和removeImage()。

QCanvasImage QCanvasPainter::addImage(QRhiTexture *texture, QCanvasPainter::ImageFlags flags = {})

textureflags 添加为绘画者可用的纹理。标志NativeTexture 已隐式设置。返回的QCanvasImage 可与drawImageQCanvasImagePattern 一起使用。

注: 占用texture 的所有权。

这是一个重载函数。

另请参阅 drawImage() 和removeImage()。

QCanvasImage QCanvasPainter::addImage(const QCanvasOffscreenCanvas &canvas, QCanvasPainter::ImageFlags flags = {})

canvasflags 一起注册到绘制者处,使其可以作为图像使用。返回的QCanvasImage 可与drawImageQCanvasImagePattern 一起使用。

注意: canvas 将继续管理底层的本地图形资源,这意味着removeImage() 不会使canvas 失效。

这是一个重载函数。

另请参阅 drawImage() 和removeImage()。

void QCanvasPainter::addPath(const QPainterPath &path)

path 添加到当前路径中。

注意: QCanvasPainter 使用 WindingFill(非零)填充规则,这意味着所有 QPainterPaths 都无法正确渲染。例如,当路径包含有洞的文本字符时,这种情况就很明显。

注: 提供此方法主要是为了与QPainterQPainterPath 兼容。与直接使用QCanvasPainter 方法绘制路径相比,此方法不会提高性能。

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

path 添加到当前路径中,可选择使用transform 更改路径点。当transform 未提供(或为同位矩阵)时,该操作会非常快,因为它会重复使用路径数据。

// m_path is QCanvasPath
if (m_path.isEmpty())
    m_path.circle(60, 60, 40);
p->beginPath();
p->addPath(m_path);
p->addPath(m_path, QTransform::fromTranslate(80, 80));
p->fill();
p->stroke();

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

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

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    m_path.moveTo(20, 60);
    for (int i = 1; i < 160; i++) {
        m_path.lineTo(20 + i,
                      60 + 20 * sin(0.1 * i));
    }
}
p->stroke(m_path);
p->beginPath();
p->addPath(m_path, 20, 100,
           QTransform::fromTranslate(0, 80));
p->stroke();

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

创建新的圆弧形子路径。圆弧中心位于centerX,centerY, 与radius 之间,圆弧从角度a0 画到a1 ,并在direction (ClockWiseCounterClockWise) 中扫过。当connectionNotConnected 时,arc 不会从之前的路径位置添加一条线到弧的起点。角度的单位是弧度。

p->beginPath();
p->moveTo(100, 100);
p->arc(100, 100, 80, 0, 1.5 * M_PI);
p->closePath();
p->fill();
p->stroke();

注意: HTML canvas 2D 上下文使用 arc() 来绘制圆,而QCanvasPainter 则建议使用circle() 或ellipse() 来绘制圆。

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

创建新的圆弧形子路径。圆弧中心位于centerPointradius ,圆弧从角度a0 画到a1 ,并在directionClockWiseCounterClockWise )上扫过。当connectionNotConnected 时,弧不会从之前的路径位置添加一条线到弧的起点。角度的单位是弧度。

注意: HTML 画布 2D 上下文使用 arc() 来绘制圆,而QCanvasPainter 则建议使用circle() 或ellipse() 来绘制圆。

这是一个重载函数。

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

在最后一个路径点和两个指定点(x1,y1x2,y2 )与radius 所定义的角上添加一个弧段。如有必要,弧段会自动用直线连接到路径的最新点。

p->beginPath();
p->moveTo(20, 20);
p->arcTo(240, 20, 20, 220, 50);
p->arcTo(20, 220, 20, 20, 30);
p->stroke();

void QCanvasPainter::arcTo(QPointF controlPoint1, QPointF controlPoint2, float radius)

在最后一个路径点定义的角上添加一个弧段,并将两个指定点 (controlPoint1controlPoint2) 与radius 添加在一起。如有必要,弧段会自动用直线连接到路径的最新点。

这是一个重载函数。

void QCanvasPainter::beginHoleSubPath()

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

p->beginPath();
p->circle(100, 100, 80);
p->beginHoleSubPath();
p->rect(60, 60, 80, 80);
p->beginSolidSubPath();
p->circle(100, 100, 20);
p->fill();
p->stroke();

另请参见 beginSolidSubPath().

void QCanvasPainter::beginPath()

开始绘制新路径,同时清除当前路径。

void QCanvasPainter::beginSolidSubPath()

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

另请参见 beginHoleSubPath().

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

通过两个控制点 (cp1X,cp1Ycp2X,cp2Y) 添加从路径最后一点到指定点 (x,y) 的立体贝塞尔线段。

p->beginPath();
p->moveTo(20, 20);
p->bezierCurveTo(150, 50, 50, 250, 180, 120);
p->stroke();

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

通过两个控制点(controlPoint1controlPoint2 )从路径的最后一点向指定点endPoint 添加立方体贝塞尔曲线段。

这是一个重载函数。

void QCanvasPainter::circle(float centerX, float centerY, float radius)

在 (centerX,centerY) 与radius 之间创建新的圆形子路径。

p->beginPath();
p->circle(100, 100, 80);
p->fill();
p->stroke();

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

centerPoint 中创建新的圆形子路径,radius

这是一个重载函数。

void QCanvasPainter::cleanupResources()

将未使用的纹理从缓存中删除。

此外,其他缓存和池可能会在调用此函数时缩小,以尽量减少内存使用。这可能会导致之后的绘制调用更加昂贵。

void QCanvasPainter::clearRect(float x, float y, float width, float height)

用透明黑色填充x,y,width,height 指定的矩形区域,从而清除矩形区域内的像素。由于清除不需要混合,因此比fillRect() 更快。

p->beginPath();
p->circle(100, 100, 80);
p->fill();
p->stroke();
p->clearRect(60, 0, 80, 120);

void QCanvasPainter::clearRect(const QRectF &rect)

用透明黑色填充rect 指定的矩形区域,擦除矩形区域内的像素。这是一个使用QRectF 的重载方法。

这是一个重载函数。

void QCanvasPainter::closePath()

用线段关闭当前子路径。这相当于lineTo ([起点])作为最后一个路径元素。

QCanvasOffscreenCanvas QCanvasPainter::createCanvas(QSize pixelSize, int sampleCount = 1, QCanvasOffscreenCanvas::Flags flags = {})

用给定的pixelSizesampleCountflags 返回一个新的离屏画布。

画布的大小以像素为单位。pixelSizesampleCountflags 属性之后不可更改。要获取不同尺寸、样本数或标记的画布,请创建一个新画布。

要使用绘制命令锁定屏幕外的画布,在使用底层 API 时,请调用相应的QCanvasRhiPaintDriver::beginPaint() 重载;在使用方便的 widget 或Qt Quick item 类时,请调用QCanvasPainterWidget::beginCanvasPainting() 或QCanvasPainterItemRenderer::beginCanvasPainting()。

通常,在画布上绘制时,画布的内容会被清除。要禁用此功能,请在flags 中传递PreserveContents

要在画布上进行多采样呈现(多采样抗锯齿,MSAA),请设置大于 1 的采样数,如 4 或 8。不过,启用多重采样后,将不支持在两次渲染之间保留画布内容,在这种情况下,PreserveContents 标志将不起作用。

void QCanvasPainter::destroyCanvas(QCanvasOffscreenCanvas &canvas)

销毁支持canvas 的资源。这样,canvas 就变成了null canvas

绘画器在销毁时会自动执行此操作。因此,只有在需要立即释放相关资源时,才有必要调用此函数。

float QCanvasPainter::devicePixelRatio() const

返回物理像素与设备无关像素之间的比率。默认值为1.0

void QCanvasPainter::drawBoxShadow(const QCanvasBoxShadow &shadow)

绘制一个方框shadow 。阴影将按照shadow 中设置的位置、大小、颜色、模糊度等进行绘制。无需在此方法之前调用beginPath() 。

注: 要直观查看 drawBoxShadow() 覆盖的区域,请设置QCPAINTER_DEBUG_SHADOW_RECT 环境变量。

QRectF rect(40, 40, 120, 120);
QRectF shadowRect = rect.translated(-2, 4);
QCanvasBoxShadow shadow(shadowRect, 0, 30);
p->drawBoxShadow(shadow);
p->beginPath();
p->roundRect(rect, 30);
p->setFillStyle("#2CDE85");
p->fill();

另请参阅 QCanvasBoxShadow

void QCanvasPainter::drawImage(const QCanvasImage &image, float x, float y)

按默认大小将image 绘制到x,y 中。

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
p->drawImage(image, 36, 36);

另请参见 addImage().

void QCanvasPainter::drawImage(const QCanvasImage &image, const QRectF &destinationRect)

image 绘制到destinationRect 的位置和大小。

这是一个重载函数。

另请参见 addImage().

void QCanvasPainter::drawImage(const QCanvasImage &image, const QRectF &sourceRect, const QRectF &destinationRect)

sourceRect 图像区域,将image 绘制到destinationRect 的位置和大小。

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
QRectF sourceRect(20, 30, 54, 76);
QRectF destinationRect(0, 0, 200, 200);
p->drawImage(image, sourceRect, destinationRect);

这是一个重载函数。

另请参见 addImage().

void QCanvasPainter::drawImage(const QCanvasImage &image, float x, float y, float width, float height)

image 绘制到x,y, 给定的widthheight 中。

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
p->drawImage(image, 50, 0, 100, 200);

这是一个重载函数。

另请参见 addImage().

void QCanvasPainter::ellipse(float centerX, float centerY, float radiusX, float radiusY)

创建新的椭圆形子路径,将radiusXradiusY 插入 (centerX,centerY) 。

p->beginPath();
p->ellipse(100, 100, 80, 60);
p->fill();
p->stroke();

void QCanvasPainter::ellipse(const QRectF &rect)

rect 中创建新的椭圆形子路径。该椭圆将覆盖rect 区域。

QRectF rect(40, 20, 120, 160);
p->fillRect(rect);
p->beginPath();
p->ellipse(rect);
p->stroke();

这是一个重载函数。

void QCanvasPainter::ellipse(QPointF centerPoint, float radiusX, float radiusY)

通过radiusXradiusYcenterPoint 中创建新的椭圆形子路径。

这是一个重载函数。

void QCanvasPainter::fill()

使用当前填充样式填充当前路径。

p->beginPath();
p->rect(20, 20, 40, 160);
p->rect(140, 20, 40, 160);
p->circle(100, 100, 60);
p->fill();

另请参见 setFillStyle()。

void QCanvasPainter::fill(const QCanvasPath &path, int pathGroup = 0)

使用当前填充样式填充path ,并将其归入pathGroup 。当路径包含的命令较多且大部分是静态命令时,通过QCanvasPath 进行绘制是最佳选择。默认情况下,pathGroup0 ,因此使用第一组。当pathGroup-1 时,GPU 端不会缓存路径。有关使用路径缓存组的更多信息,请参阅QCanvasPath 文档。不需要在本方法之前调用beginPath() 。

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    for (int i = 0; i < 16; i++) {
        float w = 100 + 60 * sin(i);
        m_path.rect(100 - w * 0.5,
                    22 + i * 10,
                    w, 6);
    }
}
p->fill(m_path);

这是一个重载函数。

另请参阅 setFillStyle()。

void QCanvasPainter::fillRect(float x, float y, float width, float height)

在指定位置 (x,y) 绘制填充矩形,大小为width,height

注: 这是为方便起见而提供的。当填充不止一个矩形时,最好使用rect() 。

p->fillRect(20, 20, 160, 160);
// The above code does same as:
//  p->beginPath();
//  p->rect(20, 20, 160, 160);
//  p->fill();

void QCanvasPainter::fillRect(const QRectF &rect)

rect 中绘制填充矩形。这是一个使用QRectF 的重载方法。

注: 提供此方法是为了方便。当填充不止一个矩形时,请使用rect() 。

这是一个重载函数。

void QCanvasPainter::fillText(const QString &text, float x, float y, float maxWidth = -1)

在指定位置 (x,y) 以当前 textAlign 和 textBaseline 绘制text 字符串。要将文本换行成多行,可将maxWidth 参数设置为首选行宽(以像素为单位)。行首的空白会被去掉,文本会在单词边界或遇到换行符时被分割。长度超过最大宽度的单词将在最近的字符处分割(即不使用连字符)。

void QCanvasPainter::fillText(const QString &text, const QRectF &rect)

使用当前 textAlign 和 textBaseline 在rect 内绘制text 字符串。矩形参数的宽度用作最大宽度。

这是一个使用QRectF 的重载方法。使用该方法绘制文本时,将文本基线设置为TextBaseline::TopTextBaseline::Middle 通常非常有用。

这是一个重载函数。

void QCanvasPainter::fillText(const QString &text, QPointF point, float maxWidth = -1)

以当前 textAlign 和 textBaseline 在指定的point 处绘制text 字符串。要将文本换行成多行,可将maxWidth 参数设置为首选行宽(以像素为单位)。行首的空白会被去掉,文本会在单词边界或遇到换行符时被分割。长度超过最大宽度的单词将在最近的字符处分割(即不使用连字符)。

这是一个使用QPointF 的重载方法。

这是一个重载函数。

QTransform QCanvasPainter::getTransform() const

返回当前变换。

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

添加从路径最后一点到 (x,y) 点的线段。

p->beginPath();
p->moveTo(20, 20);
p->lineTo(140, 180);
p->lineTo(180, 120);
p->stroke();

void QCanvasPainter::lineTo(QPointF point)

添加从路径中最后一点到point 的线段。

这是一个重载函数。

[static] float QCanvasPainter::mmToPx(float mm)

将毫米mm 转换为像素的静态辅助方法。这样就可以进行与分辨率无关的绘图。例如,要将线宽设置为 2 毫米,请使用

painter->setLineWidth(QCanvasPainter::mmToPx(2));

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

以 (x,y) 为第一点,开始新的子路径。

void QCanvasPainter::moveTo(QPointF point)

point 为第一点启动新的子路径。

这是一个重载函数。

[static] float QCanvasPainter::ptToPx(float pt)

静态辅助方法,用于将点pt 转换为像素。

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

通过控制点 (cpX,cpY) 添加从路径最后一点到指定点 (x,y) 的二次方形贝塞尔线段。

p->beginPath();
p->moveTo(20, 20);
p->quadraticCurveTo(150, 50, 180, 180);
p->quadraticCurveTo(20, 220, 20, 20);
p->fill();
p->stroke();

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

从路径的最后一点通过controlPoint 添加二次贝塞尔线段到指定的endPoint

这是一个重载函数。

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

在位置x,y 上创建新的矩形子路径,大小为width,height

p->beginPath();
p->rect(20, 20, 160, 160);
p->fill();
p->stroke();

void QCanvasPainter::rect(const QRectF &rect)

rect 上创建新的矩形子路径。这是一个使用QRectF 的重载方法。

这是一个重载函数。

void QCanvasPainter::removeImage(const QCanvasImage &image)

释放与image 相关的资源,并从绘制器中删除图像。

注: 通常不需要调用此函数,因为纹理等资源会在绘制器析构函数中释放。当需要减少内存使用量时,如果有很多图片,而其中一些已经不再使用,这个函数就很有用。

注: 删除的图像不能再用于绘制操作。

注意: 使用底层 3D API 创建的纹理等资源可能不会立即释放。此类操作可能会被推迟到后续帧,通常是在当前的绘制调用提交后,当QCanvasPainter 重新开始绘制时。

另请参阅 addImage().

void QCanvasPainter::removePathGroup(int pathGroup)

从画家缓存中删除pathGroup 。在此之后调用fill() 或pathGroupstroke() 会将路径重新生成到组缓存中。

注意: 通常不需要调用此函数,因为路径会在绘制器析构函数中移除。只有在不再需要pathGroup 或路径中的命令比过去少很多,需要减少缓冲区大小时,才会使用此功能来减少内存使用。

另请参见 fill() 和stroke()。

QCanvasPainter::RenderHints QCanvasPainter::renderHints() const

返回一个标志,用于指定为该绘制器设置的渲染提示。

另请参阅 setRenderHints() 和setRenderHint()。

void QCanvasPainter::reset()

将当前画布状态重置为默认值。

注意: 此方法与 HTML canvas 2D context reset() 方法不同,它不会在视觉上清除画布缓冲区。

// Adjust the paint state
p->setStrokeStyle("#00414A");
p->setFillStyle("#2CDE85");
p->setLineWidth(10);
QRectF rect(20, 40, 160, 50);
p->translate(rect.center());
p->rotate(qDegreesToRadians(-25));
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 20);
p->fill();
p->stroke();
// Reset to default paint state
p->reset();
p->fillRect(20, 140, 60, 40);
p->strokeRect(120, 140, 60, 40);

另请参阅 save() 和restore()。

void QCanvasPainter::resetClipping()

重置并禁用削波。

另请参阅 setClipRect().

void QCanvasPainter::resetTransform()

将当前变换重置为身份矩阵。

void QCanvasPainter::restore()

弹出并恢复当前的呈现状态。因此,之前保存的状态将被恢复。如果save() 未被调用,且状态栈为空,则调用此命令不会有任何效果。

另请参见 save()。

void QCanvasPainter::rotate(float angle)

将当前坐标系顺时针旋转angle

角度以弧度为单位。使用qDegreesToRadians() 将度转换为弧度。

QRectF rect(20, 70, 160, 60);
p->translate(rect.center());
p->rotate(-M_PI / 4);
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 10);
p->fill();
p->stroke();
p->setFillStyle(QColorConstants::Black);
p->fillText("Cute!", rect);

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

x,y 位置创建新的圆角矩形子路径,大小为width,height 。四舍五入后,radius

p->beginPath();
p->roundRect(20, 20, 160, 160, 30);
p->fill();
p->stroke();

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

rect 上创建新的圆角矩形子路径,radius 角。这是一个使用QRectF 的重载方法。

这是一个重载函数。

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

rect 创建新的圆角矩形子路径。圆角处理可按角变化,如radiusTopLeft,radiusTopRight,radiusBottomRight,radiusBottomLeft

这是一个重载函数。

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

x,y 位置创建新的圆角矩形子路径,大小为width,height 。圆角可以按角变化,大小为radiusTopLeft,radiusTopRight,radiusBottomRight,radiusBottomLeft

p->beginPath();
p->roundRect(20, 20, 160, 160,
             0, 40, 20, 80);
p->fill();
p->stroke();

这是一个重载函数。

void QCanvasPainter::save()

将当前的呈现状态推送并保存到状态栈中。必须使用匹配的restore() 才能恢复状态。

p->strokeRect(20, 20, 160, 40);
// Save and adjust the paint state
p->save();
p->setStrokeStyle(QColorConstants::Black);
p->setLineWidth(3);
p->rotate(0.1);
p->strokeRect(20, 80, 180, 20);
// Restore the saved paint state
p->restore();
p->strokeRect(20, 140, 160, 40);

另请参阅 restore().

void QCanvasPainter::scale(float scale)

scale 对当前坐标系进行缩放。x 坐标和 y 坐标都会平均缩放。

QRectF rect(20, 20, 160, 160);
for (int i = 0; i < 20; i++) {
    p->beginPath();
    p->roundRect(rect, 10);
    p->stroke();
    p->translate(rect.center());
    p->scale(0.8);
    p->translate(-rect.center());
}

void QCanvasPainter::scale(float scaleX, float scaleY)

通过scaleXscaleY 对当前坐标系进行缩放。

这是一个重载函数。

void QCanvasPainter::setAntialias(float antialias)

将当前的抗锯齿量设置为antialias (单位:像素)。更多的抗锯齿意味着更平滑的绘制。这只影响填充和描边,不影响图像或文本。默认值为1.0 ,最大值为10.0

抗锯齿可以按路径修改,因此可以在每次描边/填充前设置。要在整个画布绘制过程中禁用抗锯齿,请使用QCanvasPainter::RenderHint::Antialiasing render hint。

p->setLineWidth(6);
for (int i = 1; i < 10 ; i++) {
    int y = i * 20;
    p->setAntialias(i);
    p->beginPath();
    p->moveTo(20, y);
    p->bezierCurveTo(80, y + 20, 120,
                     y - 20, 180, y);
    p->stroke();
}

另请参见 setRenderHints() 和setTextAntialias()。

void QCanvasPainter::setBrushTransform(const QTransform &transform)

将当前画笔变换设置为transform 。此变换同时应用于描边和填充画笔。

void QCanvasPainter::setClipRect(float x, float y, float width, float height)

将当前剪刀矩形设置为 (x,y,width,height)。剪刀矩形按当前变换进行变换。

注: 剪切会带来一定的性能损失,只有在需要时才可使用。

QRectF viewArea(20, 20, 160, 160);
p->setClipRect(viewArea);
p->beginPath();
p->circle(40, 40, 110);
p->fill();
p->setFillStyle(Qt::black);
p->fillText("Clip me...", 40, 100);
p->strokeRect(viewArea);

另请参见 resetClipping().

void QCanvasPainter::setClipRect(const QRectF &rect)

将当前的剪切矩形设置为rect 。剪切矩形按当前变换进行变换。

注意: 剪切会带来一定的性能损失,只有在需要时才可使用。

这是一个重载函数。

另请参阅 resetClipping().

void QCanvasPainter::setFillStyle(const QColor &color)

将填充样式设置为纯色color 。默认填充样式为纯黑色(0, 0, 0, 1)。

p->setFillStyle(QColorConstants::Black);
p->fillRect(20, 20, 160, 160);
p->setFillStyle(QColor(0, 65, 74));
p->fillRect(40, 40, 120, 120);
p->setFillStyle("#2CDE85");
p->fillRect(60, 60, 80, 80);

void QCanvasPainter::setFillStyle(const QCanvasBrush &brush)

将填充样式设置为brush 。默认填充样式为纯黑色(0, 0, 0, 1)。

QCanvasRadialGradient g2(140, 40, 300);
g2.setStartColor(QColor(44, 222, 133));
g2.setEndColor(QColor(0, 65, 74));
p->setFillStyle(g2);
p->fillRect(20, 20, 160, 160);
g2.setCenterPosition(100, 100);
p->setFillStyle(g2);
p->fillRect(40, 40, 120, 120);

这是一个重载函数。

void QCanvasPainter::setFont(const QFont &font)

font 设置为当前活动字体。

void QCanvasPainter::setGlobalAlpha(float alpha)

将全局 alpha(透明度)值设置为alpha 。此 alpha 值将应用于所有渲染的图形。已经透明的路径也会按比例变得更加透明。Alpha 值应介于 0.0(完全透明)和 1.0(完全不透明)之间。默认情况下,alpha 值为1.0

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalAlpha(1.0 - i * 0.3);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalBrightness(float value)

将全局亮度设置为value 。该亮度将应用于所有渲染的图形。值为 0 时,绘画将完全变黑。亮度值也可以大于 1.0,以增加亮度。默认情况下,亮度为1.0

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalBrightness(1.5 - i * 0.45);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalCompositeOperation(QCanvasPainter::CompositeOperation operation)

将全局合成操作模式设置为operation 。该模式适用于所有喷涂操作。默认模式为QCanvasPainter::CompositeOperation::SourceOver

void QCanvasPainter::setGlobalContrast(float value)

将全局对比度设置为value 。该对比度将应用于所有渲染的图形。值为 0 时,绘画将完全呈灰色(0.5, 0.5, 0.5)。数值也可以大于 1.0,以增加对比度。默认情况下,对比度为1.0

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalContrast(1.5 - i * 0.45);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalSaturate(float value)

将全局饱和度设置为value 。该饱和度将应用于所有渲染的图形。值为 0 时,将禁用饱和度,使绘画完全灰度化。数值也可以大于 1.0,以增加饱和度。默认情况下,饱和度为1.0

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalSaturate(1.5 - i * 0.5);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setLineCap(QCanvasPainter::LineCap cap)

将 stoke 的行尾设置为cap 。默认行上限为QCanvasPainter::LineCap::Butt

QCanvasPath path;
path.moveTo(40, 60);
path.lineTo(160, 60);
p->setLineCap(QCanvasPainter::LineCap::Butt);
p->stroke(path, -1);
p->setLineCap(QCanvasPainter::LineCap::Square);
p->translate(0, 40);
p->stroke(path, -1);
p->setLineCap(QCanvasPainter::LineCap::Round);
p->translate(0, 40);
p->stroke(path, -1);

void QCanvasPainter::setLineJoin(QCanvasPainter::LineJoin join)

将描边的连线设置为join 。默认连线为QCanvasPainter::LineJoin::Miter

QCanvasPath path;
path.moveTo(40, 20);
path.lineTo(100, 80);
path.lineTo(160, 40);
path.lineTo(160, 70);
p->setLineJoin(QCanvasPainter::LineJoin::Miter);
p->stroke(path, -1);
p->setLineJoin(QCanvasPainter::LineJoin::Bevel);
p->translate(0, 50);
p->stroke(path, -1);
p->setLineJoin(QCanvasPainter::LineJoin::Round);
p->translate(0, 50);
p->stroke(path, -1);

另请参阅 setMiterLimit() 。

void QCanvasPainter::setLineWidth(float width)

设置width 的描边线宽,单位为像素。默认线宽为1.0 。启用抗锯齿功能后,单像素以下的线宽会自动减弱不透明度,从而产生平滑的输出效果。

for (int i = 1; i < 10 ; i++) {
    int y = i * 20;
    p->setLineWidth(0.5 * i);
    p->beginPath();
    p->moveTo(20, y);
    p->bezierCurveTo(80, y + 20, 120,
                     y - 20, 180, y);
    p->stroke();
}

另请参阅 stroke() 。

void QCanvasPainter::setMiterLimit(float limit)

将斜切限位设置为limit 。斜切限值可控制何时对锐角进行斜切。当角的长度超过此限制时,QCanvasPainter::LineJoin::Bevel 将应用于线条之间。这仅对QCanvasPainter::LineJoin::Miter 的线条连接有效。默认限制为10.0

另请参见 setLineJoin()。

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

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

p->beginPath();
p->roundRect(20, 20, 160, 160, 40);
p->setPathWinding(QCanvasPainter::PathWinding::ClockWise);
p->circle(140, 60, 20);
p->rect(60, 120, 80, 30);
p->fill();
p->stroke();

另请参阅 beginHoleSubPath() 和beginSolidSubPath()。

void QCanvasPainter::setRenderHint(QCanvasPainter::RenderHint hint, bool on = true)

如果on 为 true,则在绘制器上设置给定的呈现hint ;否则清除呈现提示。

另请参阅 setRenderHints() 和renderHints()。

void QCanvasPainter::setRenderHints(QCanvasPainter::RenderHints hints, bool on = true)

如果on 为 true,则在绘制器上设置给定的呈现hints ;否则清除呈现提示。

另请参阅 setRenderHint() 和renderHints()。

void QCanvasPainter::setStrokeStyle(const QColor &color)

将描边样式设置为纯色color 。默认描边样式为纯黑色(0, 0, 0, 1)。

p->setStrokeStyle(QColorConstants::Black);
p->strokeRect(20, 20, 160, 160);
p->setStrokeStyle(QColor(0, 65, 74));
p->strokeRect(40, 40, 120, 120);
p->setStrokeStyle("#2CDE85");
p->strokeRect(60, 60, 80, 80);

void QCanvasPainter::setStrokeStyle(const QCanvasBrush &brush)

将描边样式设置为brush 。默认描边样式为纯黑色(0, 0, 0, 1)。

QCanvasLinearGradient g1(180, 20, 20, 180);
g1.setStartColor(QColor(44, 222, 133));
g1.setEndColor(Qt::black);
p->setStrokeStyle(g1);
p->strokeRect(20, 20, 160, 160);
g1.setEndColor(Qt::yellow);
p->setStrokeStyle(g1);
p->strokeRect(40, 40, 120, 120);

这是一个重载函数。

void QCanvasPainter::setTextAlign(QCanvasPainter::TextAlign align)

将文本的水平对齐方式设置为align 。默认对齐方式为QCanvasPainter::TextAlign::Start

QFont font("Titillium Web", 22);
p->setFont(font);
p->fillRect(100, 0, 1, 200);
p->setTextAlign(QCanvasPainter::TextAlign::Left);
p->fillText("Left", 100, 40);
p->setTextAlign(QCanvasPainter::TextAlign::Center);
p->fillText("Center", 100, 70);
p->setTextAlign(QCanvasPainter::TextAlign::Right);
p->fillText("Right", 100, 100);
p->setTextAlign(QCanvasPainter::TextAlign::Start);
p->fillText("Start", 100, 130);
p->setTextAlign(QCanvasPainter::TextAlign::End);
p->fillText("End", 100, 160);

另请参阅 setTextBaseline() 。

void QCanvasPainter::setTextAntialias(float antialias)

设置当前文本抗锯齿量。antialias 的值是正常抗锯齿的倍数,即0.0 关闭抗锯齿,2.0 将其加倍。默认值为 1.0。

注意: 由于使用的是文本抗锯齿技术(SDF),最大抗锯齿量相当有限,当字体较小时影响较小。

QFont font("Titillium Web", 20);
p->setFont(font);
p->setTextAntialias(1.0);
p->fillText("Antialiasing: 1.0", 100, 25);
p->setTextAntialias(2.0);
p->fillText("Antialiasing: 2.0", 100, 75);
p->setTextAntialias(3.0);
p->fillText("Antialiasing: 3.0", 100, 125);
p->setTextAntialias(4.0);
p->fillText("Antialiasing: 4.0", 100, 175);

void QCanvasPainter::setTextBaseline(QCanvasPainter::TextBaseline baseline)

将文本的垂直对齐方式(基线)设置为baseline 。默认对齐方式为QCanvasPainter::TextBaseline::Alphabetic

QFont font("Titillium Web", 16);
p->setFont(font);
p->fillRect(0, 60, 200, 1);
p->fillRect(0, 140, 200, 1);
p->setTextBaseline(QCanvasPainter::TextBaseline::Bottom);
p->fillText("Bottom", 40, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Middle);
p->fillText("Middle", 100, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Top);
p->fillText("Top", 160, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Alphabetic);
p->fillText("Alphabetic", 50, 140);
p->setTextBaseline(QCanvasPainter::TextBaseline::Hanging);
p->fillText("Hanging", 150, 140);

另请参阅 setTextAlign() 。

void QCanvasPainter::setTextDirection(QCanvasPainter::TextDirection direction)

将文本方向设置为direction 。默认方向为QCanvasPainter::TextDirection::Inherit

void QCanvasPainter::setTextLineHeight(float height)

设置换行文本的行高调整(以像素为单位),height 。默认行高为0

QRectF r1(40, 5, 120, 60);
QRectF r2(40, 70, 120, 60);
QRectF r3(40, 135, 120, 60);
p->strokeRect(r1);
p->strokeRect(r2);
p->strokeRect(r3);
p->setTextLineHeight(-10);
p->fillText("Text with line height: -10", r1);
p->setTextLineHeight(0);
p->fillText("Text with line height: 0", r2);
p->setTextLineHeight(10);
p->fillText("Text with line height: 10", r3);

void QCanvasPainter::setTextWrapMode(QCanvasPainter::WrapMode wrapMode)

将文本换行模式设置为wrapMode 。默认换行模式为QCanvasPainter::WrapMode::NoWrap

QRectF r1(50, 5, 100, 60);
QRectF r2(50, 70, 100, 60);
QRectF r3(50, 135, 100, 60);
p->strokeRect(r1);
p->strokeRect(r2);
p->strokeRect(r3);
QString s("This is a long string.");
p->setTextWrapMode(QCanvasPainter::WrapMode::NoWrap);
p->fillText(s, r1);
p->setTextWrapMode(QCanvasPainter::WrapMode::Wrap);
p->fillText(s, r2);
p->setTextWrapMode(QCanvasPainter::WrapMode::WrapAnywhere);
p->fillText(s, r3);

void QCanvasPainter::setTransform(const QTransform &transform)

重置当前变换,并使用transform 代替。

p->beginPath();
p->roundRect(80, 20, 40, 40, 10);
p->fill();
p->stroke();
QTransform t;
t.translate(100, 20);
t.rotate(45);
t.scale(2.0, 2.0);
p->setTransform(t);
p->beginPath();
p->roundRect(20, 20, 40, 40, 10);
p->fill();
p->stroke();

另请参见 transform().

void QCanvasPainter::skew(float angleX, float angleY = 0.0f)

将当前坐标系沿 X 轴偏斜(剪切)angleX ,沿 Y 轴偏斜(剪切)angleY 。角度以弧度为单位。

QRectF rect(40, 70, 120, 60);
p->translate(rect.center());
p->skew(-0.6);
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 10);
p->fill();
p->stroke();
p->setFillStyle(QColorConstants::Black);
p->fillText("Cute!", rect);

void QCanvasPainter::stroke()

用当前笔触样式描边当前路径。

p->beginPath();
p->rect(20, 20, 40, 160);
p->rect(140, 20, 40, 160);
p->circle(100, 100, 60);
p->stroke();

另请参见 setStrokeStyle()。

void QCanvasPainter::stroke(const QCanvasPath &path, int pathGroup = 0)

以当前笔画样式绘制path ,并将其归入pathGroup 。当路径包含的命令较多且大部分是静态命令时,通过QCanvasPath 进行绘制是最佳选择。默认情况下,pathGroup0 ,因此使用第一组。当pathGroup-1 时,GPU 端不会缓存路径。有关使用路径缓存组的更多信息,请参阅QCanvasPath 文档。不需要在本方法之前调用beginPath() 。

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    for (int i = 0; i < 16; i++) {
        int h = 100 + 60 * sin(i);
        m_path.rect(22 + i * 10,
                    180 - h,
                    6, h);
    }
}
p->stroke(m_path);

这是一个重载函数。

另请参阅 setStrokeStyle()。

void QCanvasPainter::strokeRect(float x, float y, float width, float height)

在指定位置 (x,y) 绘制一个戳记矩形,大小为width,height

注: 这是为方便起见而提供的。如果不止绘制一个矩形,请使用rect() 。

p->strokeRect(20, 20, 160, 160);
// The above code does same as:
// p->beginPath();
// p->rect(20, 20, 160, 160);
// p->stroke();

void QCanvasPainter::strokeRect(const QRectF &rect)

rect 中绘制戳记矩形。这是一个使用QRectF 的重载方法。

注意: 这是为方便起见而提供的。当绘制不止一个矩形时,请使用rect() 。

这是一个重载函数。

QRectF QCanvasPainter::textBoundingBox(const QString &text, float x, float y, float maxWidth = -1)

在 (x,y) 处测量text 字符串的边框。若要测量多行文本,可将maxWidth 参数设置为首选行宽(以像素为单位)。返回QRectF ,值为 [xmin、ymin、width、height]。测量值以本地坐标空间返回。

QString s("Built with Qt");
QPointF pos1(20, 20);
QRectF box1 = p->textBoundingBox(s, pos1);
p->strokeRect(box1);
p->fillText(s, pos1);
p->setTextWrapMode(QCanvasPainter::WrapMode::WordWrap);
p->setTextAlign(QCanvasPainter::TextAlign::Center);
QPointF pos2(100, 80);
QRectF box2 = p->textBoundingBox(s, pos2, 100);
p->strokeRect(box2);
p->fillText(s, pos2, 100);

QRectF QCanvasPainter::textBoundingBox(const QString &text, const QRectF &rect)

rect 处测量text 字符串的边界框。返回QRectF ,值为 [xmin、ymin、width、height]。测量值以本地坐标空间返回。

这是一个重载函数。

QRectF QCanvasPainter::textBoundingBox(const QString &text, QPointF point, float maxWidth = -1)

point 处测量text 字符串的边框。要测量多行文本,可将maxWidth 参数设置为首选行宽(以像素为单位)。返回QRectF ,值为 [xmin、ymin、width、height]。测量值以本地坐标空间返回。

这是一个重载函数。

void QCanvasPainter::transform(const QTransform &transform)

将当前坐标系与指定的transform 相乘。

QTransform t;
t.translate(100, 100);
t.rotate(36);
t.translate(-100, -100);
for (int i = 0; i < 10; i++) {
    p->transform(t);
    p->beginPath();
    p->roundRect(80, 15, 40, 20, 10);
    p->fill();
    p->stroke();
}

另请参见 setTransform() 。

void QCanvasPainter::translate(float x, float y)

通过xy 对当前坐标系进行平移。

auto paintRect = [p]() {
    p->beginPath();
    p->roundRect(20, 20, 160, 60, 10);
    p->fill();
    p->stroke();
};
paintRect();
p->translate(0, 100);
paintRect();

void QCanvasPainter::translate(QPointF point)

通过point 转换当前坐标系。

这是一个重载函数。

© 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.