百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

QML中如何使用Canvas进行图形绘制?

toqiye 2024-08-17 23:20 10 浏览 0 评论

前言

在QT4中加入QML时,一些开发者讨论如何在QtQuick中绘制一个圆形。类似圆形的问题,一些开发者也对于其它形状的支持进行了讨论。在QtQuick中没有圆形,只有矩形。在Qt4中,如果你需要一个除了矩形外的形状,你需要使用图片或者使用你自己写的C++的圆形元素。

Qt5中引入了Canvas元素,允许脚本绘制。Canvas元素提供了一个依赖于分辨率的位图画布,你可以使用JavaScript脚本来绘制图形,制作游戏或者其它的动态图像。Canvas元素是基于HTML5的画布元素来完成的。

Canvas元素的基本思想是使用一个2D对象来渲染路径。这个2D对象包括了必要的绘图函数,Canvas元素充当绘制画布。2D对象支持画笔,填充,渐变,文本和绘制路径创建命令。

简单的路径绘制示例

下面这个例子绘制了一个起点坐标为(50, 50),边长为100的填充矩形框,并且使用了画笔来修饰边界。

import QtQuick 2.3
import QtQuick.Window 2.2

Window {
    id: root
    visible: true
    width: 480
    height: 300
    color: "white"

    Canvas {
        id: paint
        width: 200
        height: 200

        onPaint: {
            var ctx = getContext("2d")
            ctx.lineWidth = 4
            ctx.strokeStyle = "blue"
            ctx.fillStyle = "steelblue"

            ctx.beginPath()
            ctx.moveTo(50, 50)
            ctx.lineTo(150, 50)
            ctx.lineTo(150, 150)
            ctx.lineTo(50, 150)
            ctx.closePath()
            ctx.fill()
            ctx.stroke()
        }
    }
}

运行效果如下:

上面例子中,画笔的宽度被设置为4个像素,并且定义strokeStyle(画笔样式)为蓝色,填充样式(fillStyle)为steelblue。只有调用stroke或者fill函数,创建的路径才会绘制,它们与其它的函数使用是相互独立的。调用stroke或者fill将会绘制当前的路径,创建的路径是不可重用的,只有绘制状态能够被存储和恢复。

在QML中,Canvas元素充当了绘制的容器,2D绘制对象提供了实际绘制的方法。绘制需要在onPaint事件中完成,画布自身提供了典型的二维笛卡尔坐标系,左上角是(0, 0)坐标,Y轴坐标轴向下,X轴坐标轴向右。

典型绘制命令

典型的绘制命令调用如下:

  1. 装载画笔或者填充模式
  2. 创建绘制路径
  3. 使用画笔绘制填充绘制路径

以绘制最简单的直线为例:

Canvas {
        id: paint
        width: 200
        height: 200

        onPaint: {
            var ctx = getContext("2d")
            ctx.strokeStyle = "red"

            ctx.beginPath()
            ctx.moveTo(50, 50)
            ctx.lineTo(150, 50)
            ctx.stroke()
        }
    }

这将产生一个从(50, 50)到(150, 50)的水平线,运行效果如下:

通常在你重置了路径后你将会设置一个开始点,所以,在beginPath()这个操作后,你需要使用moveTo来设置开始点。

便捷的接口

在绘制矩形时,Qt提供了一个便捷的接口,而不需要调用stroke或者fill来完成。

Canvas {
        id: paint
        width: 200
        height: 200

        onPaint: {
            var ctx = getContext("2d")
            ctx.fillStyle = 'green'
            ctx.strokeStyle = "blue"
            ctx.lineWidth = 4

            ctx.fillRect(20, 20, 180, 180)
            ctx.clearRect(30, 30, 160, 160)
            ctx.strokeRect(20, 20, 90, 90)
        }
    }

运行效果如下:

画笔的绘制区域由中间向两边延展。一个宽度为4像素的画笔将会在绘制路径的里面绘制2个像素,外面绘制2个像素。

渐变

画布中可以使用颜色填充也可以使用渐变色或者图像来填充。

下面的例子中,渐变色定义在开始点(100, 0)到结束点(100, 200)。在我们画布中时一个垂直线。渐变色在停止点定义一个颜色,范围从0.0到1.0。这里我们使用一个蓝色作为0.0(100, 0),一个高亮蓝色作为0。5(100, 200)。渐变色的定义比我们想要绘制的矩形更大,随意矩形在它定义的范围内对渐变进行了裁剪。

Canvas {
        id: paint
        width: 200
        height: 200

        onPaint: {
            var ctx = getContext("2d")

            var gradient = ctx.createLinearGradient(100, 0, 200, 200)
            gradient.addColorStop(0, "blue")
            gradient.addColorStop(0.5, "lightsteelblue")
            ctx.fillStyle = gradient
            ctx.fillRect(50, 50, 100, 100)
        }
    }

运行效果如下:

渐变色是在画布坐标下定义的,而不是在绘制路径相对坐标下定义的。画布中没有相对坐标的概念。

相关推荐

基于Python查找图像中最常见的颜色

如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决很多实际问题。例如在农业领域中想确定水果的成熟度,我们可以通过检查水果的颜色是否落在特定范围内,来判断它们是否已经成熟。接下来我们将使...

出大要几次/圣彼得堡悖论

程序:fromrandomimportrandomdeffn():n=1whilerandom()<0.5:n+=1returnny=[fn()...

使用OpenCV测量图像中物体之间的距离

原文链接:https://www.pyimagesearch.com/2016/04/04/measuring-distance-between-objects-in-an-image-with-op...

让颜色更加饱满和有冲击力:图像颜色校正

大家拍照或图片时,获取会遇到图像颜色与实际颜色存在色差的现象。我们看一个标准色卡的图片:第一张图片就是有色差的图片,这种现象一般是相机或光线的原因造成的,我们可以通过标准色卡进行校正。第一张图片是有色...

Python 数据分析 : 实例

1、构建矩阵生成4x4形式的矩阵,矩阵中的数据是1~10之间的随机数random_list=np.random.random(16)random_list=np.round(...

用这些免费开源的图标库,为你的项目画龙点睛

精致好看的图标能够为你的项目增色不少,今天我就整理了一期图标库精选系列,希望你可以从中找到自己喜欢的图标库。下面就跟我来一场视觉的盛宴,我会一一介绍GitHub上品牌、流行、极小,各具特色的免费精...

ICON设计规范之图标尺寸

编辑导语:图标设计是UI设计中不可缺少的元素,它看似简单,但其实内含门道。本篇文章里,作者就对icon设计的相关知识和icon绘制方法做出经验介绍。如果你对icon设计也想要有所了解的话,那就点进来看...

PHP开发必备VSCode插件(大全)

通用chinese(simplified...):简体中文语言包liveserverhtml:实时预览prettier-codeformatter:最流行的代码格式化插件...

增强用户体验:前端开发中HTML5和CSS3表格属性的应用与优化研究

摘要:本文探讨了在前端开发中HTML5和CSS3表格属性的应用与优化。首先介绍了HTML5中常用的表格元素和CSS3中丰富的表格样式属性,旨在帮助开发人员定制表格的外观和样式。其次,研究了表格结构的优...

产品经理小技术:图片素材随手找,原型设计快又好

数十万互联网从业者的共同关注!作者:牛冰峰博客:http://uxfeng.com/画图——这项古老而精细的做法,是一代代产品狗们得以传承的立足之本。草图、线框图、思维导图、PPT插图、数据汇报图表、...

MAUI Blazor 项目实战 - 从0到1轻松构建多平台应用UI

前言最近在项目中尝鲜了MAUI,总体感受下来还是挺不错的,优缺点并存,但是瑕不掩瑜,目前随着.Net版本的迭代升级对它的支持也越来越友好,相信未来可期!感兴趣的朋友欢迎关注。文章中如有不妥的地方,也请...

webstorm常用的插件

1、AtomMaterialIcons推荐原因:这款插件不仅...

「智能家居」自动化平台nodered第三方节点dashboard的使用

自带节点库讲完了,开始说说第三方节点库dashboard,该库提供另一个可配置的UI页面,可以配置一些表单元素,以及图表。先来看一下别人使用dashboard制作的面板吧,是不是很漂亮。接下来我们一...

「炫丽」从0开始做一个WPF+Blazor对话小程序

大家好,我是沙漠尽头的狼。...

MAUI使用Masa blazor组件库

上一篇(点击阅读)我们实现了UI在Web端(BlazorServer/Wasm)和客户端(Windows/macOS/Android/iOS)共享,这篇我加上MasaBlazor组件库的引用,并...

取消回复欢迎 发表评论: