Canvas QML 类型

提供了一种允许通过 JavaScript 绘制的 2D 画布项目。详情...

导入语句import QtQuick
继承

Item

属性

信号

方法

详细描述

The Canvas item allows drawing of straight and curved lines, simple and complex shapes, graphs, and referenced graphic images. It can also add text, colors, shadows, gradients, and patterns, and do low level pixel operations. The Canvas output may be saved as an image file or serialized to a URL.

Rendering to the Canvas is done using a Context2D object, usually as a result of the paint signal.

To define a drawing area in the Canvas item set the width and height properties. For example, the following code creates a Canvas item which has a drawing area with a height of 100 pixels and width of 200 pixels

import QtQuick 2.0
Canvas {
    id: mycanvas
    width: 100
    height: 200
    onPaint: {
        var ctx = getContext("2d");
        ctx.fillStyle = Qt.rgba(1, 0, 0, 1);
        ctx.fillRect(0, 0, width, height);
    }
}

Currently the Canvas item only supports the two-dimensional rendering context.

线程渲染和渲染目标

In Qt 6.0 the Canvas item supports one render target: Canvas.Image.

Canvas.Image渲染目标是QImage对象。该渲染目标支持后台线程渲染,允许复杂的或长时间运行的可绘操作在不阻塞UI的情况下执行。这是唯一所有Qt Quick后端都支持的渲染目标。

默认的渲染目标是Canvas.Image,默认的renderStrategy是Canvas.Immediate。

像素操作

支持所有HTML5 2D上下文像素操作。为了确保提高像素读取/写入性能,应选择Canvas.Image渲染目标。

迁移现有HTML5 Canvas应用程序的技巧

尽管Canvas项目提供了类似HTML5的API,但HTML5 Canvas应用程序需要在Canvas项目中进行修改以运行。

  • 将所有DOM API调用替换为QML属性绑定或Canvas项目方法。
  • 将所有HTML事件处理器替换为MouseArea项目。
  • 将setInterval/setTimeout函数调用替换为Timer项目,或使用requestAnimationFrame()。
  • 将绘画代码放入onPaint处理程序中,并通过调用markDirty()或requestPaint()方法来触发绘画。
  • 要绘制图像,通过调用Canvas的loadImage()方法来加载它们,然后在onImageLoaded处理程序中请求绘制它们。

从Qt 5.4开始,Canvas是一个纹理提供商,可以直接用于ShaderEffects和其他消费纹理提供商的类。

注意:一般应避免使用Canvas.Image渲染目标进行大型画布、频繁更新和动画。这是因为使用加速图形API,每次更新都将导致纹理上传。如果可能,最好使用QQuickPaintedItem并使用QPainter在C++中绘制,而不是使用更昂贵且可能性能较低的JavaScript和Context2D方法。

另请参阅Context2DQQuickPaintedItemQt Quick示例 - 指针处理程序

属性文档

available : bool [只读]

指示Canvas何时能够提供绘图上下文进行操作。


canvasSize : size

包含上下文在上方绘制逻辑画布的尺寸。

默认情况下,画布尺寸与当前画布项尺寸相同。

通过设置canvasSize、tileSize和canvasWindow,Canvas项目可以作为一个大型虚拟画布,具有多个单独渲染的瓦片矩形。只有那些在当前画布窗口内的瓦片将被Canvas渲染引擎绘制。

另请参阅tileSizecanvasWindow


context : object [只读]

包含活动的绘图上下文。

如果画布已准备好并且调用getContext()或contextType属性设置为支持的上下文类型已成功,则该属性将包含当前绘图上下文,否则为null。


contextType : string

要使用的绘图上下文类型。

此属性设置为活动上下文类型的名称。

如果显式设置,画布将在变得可用后尝试创建指定类型的上下文。

类型名称与getContext()调用中使用的名称相同,对于2d画布,值将为"2d"。

另请参阅 getContext()和available


renderStrategy : enumeration

包含当前画布渲染策略。

常量描述
Canvas.Immediatecontext将在主UI线程中立即执行图形命令。
Canvas.Threadedcontext将延迟图形命令到私有渲染线程。
Canvas.Cooperativecontext将延迟图形命令到应用程序的全局渲染线程。

此提示与renderTarget一起提供给图形上下文以确定渲染方法。图形上下文可能不支持renderTarget、renderStrategy或它们的组合,在这种情况下,上下文将选择适当的选项,并且Canvas将向属性发出更改信号。

配置或运行时测试可能导致QML场景图在GUI线程中渲染。选择Canvas.Cooperative,不能保证渲染将在GUI线程之外的线程上发生。

默认值是Canvas.Immediate

另请参阅 renderTarget


renderTarget : enumeration

包含当前画布渲染目标。

常量描述
Canvas.Image渲染到内存中的图像缓冲区。
Canvas.FramebufferObject自Qt 6.0以来,此值被忽略。

此提示与renderStrategy一起提供给图形上下文以确定渲染方法。图形上下文可能不支持renderStrategy、renderTarget或它们的组合,在这种情况下,上下文将选择适当的选项,并且Canvas将向属性发出更改信号。

默认渲染目标是Canvas.Image


信号文档

imageLoaded()

当图像已加载时,发出此信号。

注意:对应的处理程序是onImageLoaded

另请参阅 loadImage


paint(rect region)

当需要渲染region时,发出此信号。如果上下文是活动的,可以从中引用上下文属性。

此信号可以由markdirty()、requestPaint()或更改当前画布窗口触发。

注意:对应的处理程序是onPaint


painted()

在所有上下文绘图命令执行后和Canvas渲染后,发出此信号。

注意:对应的处理程序是onPainted


方法文档

cancelRequestAnimationFrame(int handle)

此函数将取消由handle引用的动画回调。


对象 getContext字符串 contextId, ... args

返回一个绘图上下文,如果没有上下文可用,则返回 null

参数contextId用于指定所需的上下文。Canvas 项目将返回实现所需绘图模式的上下文。在第一次调用getContext之后,任何后续与同一contextId调用getContext都将返回同一个上下文对象。任何额外的参数(args)目前被忽略。

如果不支持上下文类型或Canvas之前已被请求提供不同且不兼容的上下文类型,将返回 null

Canvas仅支持2D上下文。


isImageError(URL image)

如果image加载失败,则返回 true,否则返回 false

另请参阅 loadImage


isImageLoaded(URL image)

如果image成功加载并准备好使用,则返回true。

另请参阅 loadImage


isImageLoading(URL image)

如果当前正在加载image,则返回true。

另请参阅 loadImage


loadImage(URL image, size sourceSize = undefined)

异步加载指定的 image

一旦图像准备就绪,将发出imageLoaded()信号。可以使用unloadImage()方法卸载已加载的图像。

注意:只能在Canvas项目上绘制已加载的图像。

如果指定了sourceSize,在加载期间图像将缩放到该大小。这对于加载可伸缩(矢量)图像(例如SVGs)在预期的显示大小非常有用。该参数在Qt 6.7中引入。

另请参阅:unloadImage(),imageLoaded(),Context2D::createImageData(),和Context2D::drawImage


markDirty(矩形 area)

将指定的area标记为脏,这样当这个区域可见时,canvas渲染器将重新绘制它。这将触发

paint

信号。

另请参阅:paintrequestPaint()。


整型 requestAnimationFrame(callback)

此函数安排在组合Qt Quick场景之前调用callback


requestPaint()

请求重新绘制整个可见区域。

另请参阅:markDirty()。


布尔型 save(字符串 filename, size imageSize = undefined)

将当前画布内容保存为图像文件 filename。保存的图像格式由 filename 的后缀自动决定。保存成功时返回 true。如果指定了 imageSize,则生成的图像将具有此大小,并且设备像素比为 1.0。否则,应用于显示画布的窗口的 devicePixelRatio() 将应用于保存的图像。

注意: 调用此方法将强制绘制整个画布,而不仅仅是当前的画布可视窗口。

另请参阅 canvasWindowcanvasSizetoDataURL()。


string toDataURL(string mimeType)

返回画布中图像的数据 URL。

默认的 mimeType 是 "image/png"。

另请参阅 save


unloadImage(url image)

卸载 image

一旦图像被卸载,就无法在画布上下文中绘制,除非再次加载。

另请参阅 loadImage()、imageLoaded()、isImageLoaded()、Context2D::createImageData() 和 Context2D::drawImage


© 2024 The Qt Company Ltd. 本文件中包含的文档贡献者是各自所有权的版权所有者。本文件中提供的文档是根据 Free Software Foundation 发布的 GNU Free Documentation License 版本 1.3 的条款提供的。Qt 和相应的徽标是 The Qt Company Ltd. 在芬兰和/或其他国家/地区的商标。所有其他商标均为其各自所有者的财产。