Canvas QML 类型
提供了一种允许通过 JavaScript 绘制的 2D 画布项目。详情...
导入语句 | import QtQuick |
继承 |
属性
- available : bool
- canvasSize : size
- context : object
- contextType : string
- renderStrategy : enumeration
- renderTarget : enumeration
信号
- imageLoaded()
- paint(rect region)
- painted()
方法
- cancelRequestAnimationFrame(int handle)
- object getContext(string contextId, ... args)
- isImageError(url image)
- isImageLoaded(url image)
- isImageLoading(url image)
- loadImage(url image, size sourceSize)
- markDirty(rect area)
- int requestAnimationFrame(callback)
- requestPaint()
- bool save(string filename, size imageSize)
- string toDataURL(string mimeType)
- unloadImage(url image)
详细描述
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方法。
另请参阅Context2D、QQuickPaintedItem和Qt Quick示例 - 指针处理程序。
属性文档
available : bool |
指示Canvas何时能够提供绘图上下文进行操作。
canvasSize : size |
包含上下文在上方绘制逻辑画布的尺寸。
默认情况下,画布尺寸与当前画布项尺寸相同。
通过设置canvasSize、tileSize和canvasWindow,Canvas项目可以作为一个大型虚拟画布,具有多个单独渲染的瓦片矩形。只有那些在当前画布窗口内的瓦片将被Canvas渲染引擎绘制。
另请参阅tileSize和canvasWindow。
context : object |
包含活动的绘图上下文。
如果画布已准备好并且调用getContext()或contextType属性设置为支持的上下文类型已成功,则该属性将包含当前绘图上下文,否则为null。
contextType : string |
要使用的绘图上下文类型。
此属性设置为活动上下文类型的名称。
如果显式设置,画布将在变得可用后尝试创建指定类型的上下文。
类型名称与getContext()调用中使用的名称相同,对于2d画布,值将为"2d"。
另请参阅 getContext()和available。
renderStrategy : enumeration |
包含当前画布渲染策略。
常量 | 描述 |
---|---|
Canvas.Immediate | context将在主UI线程中立即执行图形命令。 |
Canvas.Threaded | context将延迟图形命令到私有渲染线程。 |
Canvas.Cooperative | context将延迟图形命令到应用程序的全局渲染线程。 |
此提示与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() |
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上下文。
异步加载指定的 image。
一旦图像准备就绪,将发出imageLoaded()信号。可以使用unloadImage()方法卸载已加载的图像。
注意:只能在Canvas项目上绘制已加载的图像。
如果指定了sourceSize,在加载期间图像将缩放到该大小。这对于加载可伸缩(矢量)图像(例如SVGs)在预期的显示大小非常有用。该参数在Qt 6.7中引入。
另请参阅:unloadImage(),imageLoaded(),Context2D::createImageData(),和Context2D::drawImage。
markDirty(矩形 area) |
整型 requestAnimationFrame(callback) |
此函数安排在组合Qt Quick场景之前调用callback。
requestPaint() |
请求重新绘制整个可见区域。
另请参阅:markDirty()。
将当前画布内容保存为图像文件 filename。保存的图像格式由 filename 的后缀自动决定。保存成功时返回 true
。如果指定了 imageSize,则生成的图像将具有此大小,并且设备像素比为 1.0
。否则,应用于显示画布的窗口的 devicePixelRatio() 将应用于保存的图像。
注意: 调用此方法将强制绘制整个画布,而不仅仅是当前的画布可视窗口。
另请参阅 canvasWindow、canvasSize 和 toDataURL()。
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. 在芬兰和/或其他国家/地区的商标。所有其他商标均为其各自所有者的财产。