(6)qml 画布元素(Canvas Element)

news2025/2/24 7:33:51

基本思想

画布元素(canvas element)的基本思想是使⽤⼀个2D对象来渲染路径。这个2D对象包括了必要的绘图函数,画布元素(canvas element)充当绘制画布。2D对象⽀持画笔,填充,渐变,⽂本和绘制路径创建命令。

给一个例子

import QtQuick 2.0

Canvas {
    id: root
    // canvas size
    width: 200
    height: 200
    // handler to override for drawing
    onPaint: {
        // get context to draw with
        var ctx = getContext("2d") //获取绘制内容 目前只支持2d
        // setup the stroke
        ctx.lineWidth = 5 //线宽
        ctx.strokeStyle = "black" //线的颜色
        // setup the fill
        ctx.fillStyle = "steelblue" //填充的颜色
        // begin a new path to draw
        ctx.beginPath()
        // top-left start point
        ctx.moveTo(50, 50)
        // upper line
        ctx.lineTo(150, 50)
        // right line
        ctx.lineTo(150, 150)
        // bottom line
        ctx.lineTo(50, 150)
        ctx.lineTo(50, 50)
        // left line through path closing
        ctx.closePath()
        // fill using fill style
        ctx.fill()
        // stroke using line width and stroke style
        ctx.stroke()
    }
}

画笔的宽度被设置为5个像素,并且定义strokeStyle(画笔样式)为黑⾊。最后的形状由设置填充样式(fillStyle)为steelblue颜⾊,然后填充完成的。只有调⽤stroke或者fill函数,创建的路径才会绘制,它们与其它的函数使⽤是相互独⽴的。调⽤stroke或者fill将会绘制当前的路径,创建的路径是不可重⽤的,只有绘制状态能够被存储和恢复。
在这里插入图片描述


在QML中,画布元素(canvas element)充当了绘制的容器。2D绘制对象提
供了实际绘制的⽅法。绘制需要在onPaint事件中完成。


Canvas {
width: 200; height: 200
onPaint: {
var ctx = getContext("2d")
}
}

笛卡尔坐标系统 这个名词
画布⾃⾝提供了典型的⼆维笛卡尔坐标系统,左上⾓是(0,0)坐标。Y轴坐
标轴向下,X轴坐标轴向右。

绘制命令流程如下:

  1. 装载画笔或者填充模式
  2. 创建绘制路径
  3. 使⽤画笔或者填充绘制路径
onPaint: {
var ctx = getContext("2d")
// setup the stroke
ctx.strokeStyle = "red"
// create a path
ctx.beginPath()
ctx.moveTo(50,50)
ctx.lineTo(150,50)
// stroke path
ctx.stroke()
}

在这里插入图片描述

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

便捷的接口(Convenient API)

在绘制矩形时,我们提供了⼀个便捷的接⼝,⽽不需要调⽤stroke或者fill来
完成。

// convenient.qml
import QtQuick 2.0

Canvas {
    id: root
    width: 120
    height: 120
    onPaint: {
        var ctx = getContext("2d")
        ctx.fillStyle = 'green'
        ctx.strokeStyle = "blue"
        ctx.lineWidth = 4
        // draw a filles rectangle
        ctx.fillRect(20, 20, 80, 80)
        // cut our an inner rectangle
        ctx.clearRect(30, 30, 60, 60)
        // stroke a border from top-left to
        // inner center of the larger rectangle
        ctx.strokeRect(20, 20, 40, 40)
    }
}

在这里插入图片描述

// convenient.qml
import QtQuick 2.0

Canvas {
    id: root
    width: 120
    height: 120
    onPaint: {
        var ctx = getContext("2d")
        ctx.fillStyle = 'green'
        ctx.strokeStyle = "blue"
        ctx.lineWidth = 4
        // draw a filles rectangle
        ctx.fillRect(20, 20, 80, 80)
        // cut our an inner rectangle
        // ctx.clearRect(30, 30, 60, 60)
        // stroke a border from top-left to
        // inner center of the larger rectangle
        ctx.strokeRect(20, 20, 40, 40)
        ctx.fillStyle = "blue"
        ctx.fillRect(20, 20, 40, 40)
    }
}

这部分代码说明 后面改变的颜色 不会影响前面已经画好了元素

注意
画笔的绘制区域由中间向两边延展。⼀个宽度为4像素的画笔将会在绘制路径
的⾥⾯绘制2个像素,外⾯绘制2个像素。

渐变(Gradients)

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

// convenient.qml
import QtQuick 2.0

Canvas {
    id: root
    width: 120
    height: 120
    onPaint: {
        var ctx = getContext("2d")
        var gradient = ctx.createLinearGradient(100, 0, 100, 200)
        gradient.addColorStop(0, "blue")
        gradient.addColorStop(0.5, "lightsteelblue")
        ctx.fillStyle = gradient
        ctx.fillRect(50, 50, 100, 100)
    }
}

在这里插入图片描述
createLinearGradient
该函数返回一个CanvasGradient对象,该对象表示一个线性渐变,该渐变沿着从起点(x0, y0)到终点(x1, y1)的线条进行颜色过渡。

渐变是颜色之间的平滑过渡。有两种类型的渐变:线性和径向。渐变必须有两个或更多的颜色停止点,这些停止点代表在渐变起始点和终点或圆形之间从0到1的位置上的颜色变化

在这个例⼦中,渐变⾊定义在开始点(100,0)到结束点(100,200)。在我们画布中是⼀个中间垂直的线。渐变⾊在停⽌点定义⼀个颜⾊,范围从0.0到1.0。这⾥我们使⽤⼀个蓝⾊作为0.0(100,0),⼀个⾼亮刚蓝⾊作为0.5(100,200)。渐变⾊的定义⽐我们想要绘制的矩形更⼤,所以矩形在它
定义的范围内对渐变进⾏了裁剪。

// convenient.qml
import QtQuick 2.0

Canvas {
    id: root
    width: 120
    height: 120
    onPaint: {
        var ctx = getContext("2d")
        var gradient = ctx.createLinearGradient(100, 0, 100, 200)
        gradient.addColorStop(0, "blue")
        gradient.addColorStop(0.5, "lightsteelblue")
        ctx.fillStyle = gradient
        ctx.fillRect(50, 0, 100, 200)
    }
}

在这里插入图片描述

当我们把返回放大的时候 可以看到颜色变化的地方更明显了

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1899173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小型气象站在现代农业中的应用与前景

随着科技的飞速发展,智慧农业已成为现代农业发展的重要趋势。在这一背景下,小型气象站作为智慧农业的重要组成部分,正逐渐展现出其独特的价值和广阔的应用前景。本文将从小型气象站的定义、功能、应用案例以及未来展望等方面,探讨…

文化创新与社交媒体:探索Facebook的足迹

在过去的十多年里,Facebook从一个简单的校园社交网络发展成为全球最大的社交媒体平台之一。它不仅改变了人们的沟通方式,更在许多方面推动了文化的创新和变革。本文将深入探索Facebook如何通过其平台的演进和功能创新,成为文化创新的重要推动…

合合信息大模型“加速器”亮相2024世界人工智能大会,助力大模型学好“专业课”

7月4日至7日,2024世界人工智能大会在上海拉开帷幕。现阶段,“百模大战”现象背后的中国大模型发展前景与堵点仍然是各界关注的焦点。如何帮助大模型在信息的海洋中快速找准航向,在数据的荒漠中找到高质量的“水源”?合合信息在本次…

Netty学习(NIO基础)

NIO基础 三大组件 Channel and Buffer 常用的只有ByteBuffer Selector(选择器) 结合服务器的设计演化来理解Selector 多线程版设计 最早在nio设计出现前服务端程序的设计是多线程版设计,即一个客户端对应一个socket连接,一个连接用一个线程处理,每…

雷电模拟器报错remount of the / superblock failed: Permission denied remount failed

报错截图 解决方法 打开设置 设置配置system.vmdk可写入 解决

前端从业者的历史难题Vue和React的抉择:难度不亚于丈母娘和媳妇

**前端从业者的历史难题:Vue和React的抉择——难度不亚于丈母娘和媳妇** Vue和React这两个框架无疑是当下最为流行的两个选择。它们各自拥有独特的优势和特点,吸引了大量的前端从业者。然而,对于许多从业者来说,如何在Vue和React…

基于大数据+Hadoop的豆瓣电子图书推荐系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容:SpringBoot、Vue、SSM、HLM…

Automotive之CarService和Vehicle

目录 前言一、CarService1.1 CarService 组成1.2 编译产物1.3 CarService的使用1.3.1 第一步:判断是否支持车载功能1.3.2 创建Car,获取 Manager 1.4 CarService实现原理1.4.1 启动CarServiceHelperService服务1.4.2 绑定 CarService 服务1.4.3 CarServic…

swagger的接口文档导入到yapi上

一、访问swagger接口 swagger集成到项目后,通过http:\\ip:port/swagger-ui.html 访问。 说明:这里的路径是基于swagger2。如果用swagger3,需要用swagger3的路径进行访问。 访问如图: 这就是swagger接口首页。如果想导入到yapi上…

PD虚拟机怎么联网?PD虚拟机安装Win11无法上网 pd虚拟机连不上网怎么解决 mac安装windows虚拟机教程

PD虚拟机既可以联网使用,也可以单机使用。如需将PD虚拟机联网,可以共享Mac原生系统的网络,其使用体验与真实系统无异。本文会详细讲解PD虚拟机如何联网,并会进一步解决PD虚拟机安装Win10无法上网的问题。 如果有网络相关问题的小伙…

SQL 与 NoSQL 数据库:一场关于灵活性与结构的对话

文章目录 引言SQL 数据库:传统之光定义特征优势缺点 NoSQL 数据库:新时代的弹性定义特征优势缺点 何时选择 NoSQL?场景1:海量数据与高并发场景2:灵活性需求场景3:实时数据分析场景4:分布式系统 …

无人机水运应用场景

航行运输 通航管理(海事通航管理处) 配员核查流程 海事员通过VHF(甚高频)系统与船长沟通核查时间。 无人机根据AIS(船舶自动识别系统)报告的船舶位置,利用打点定位 功能飞抵船舶上方。 使用…

TikTok马来西亚直播网络怎么配置?

TikTok是一款全球流行的社交媒体应用,在东南亚地区拥有大量用户。在马来西亚这个多元化的国家,配置高效稳定的直播网络对TikTok的运营至关重要。 配置马来西亚直播网络的必要性 广泛的地理覆盖:马来西亚包括大片陆地和众多岛屿,网…

求 自然对数 ln(x)

np.log()函数是用来计算数组中每个元素的自然对数的。自然对数是以数学常数e(约等于2.71828)为底的对数。NumPy作为一个强大的数值计算库,提供了很多用于数组操作的函数,np.log()就是其中之一。 • 下面是一个简单的例子&#xff…

某某市信息科技学业水平测试软件打开加载失败逆向分析(笔记)

引言:笔者在工作过程中,用户上报某某市信息科技学业水平测试软件在云电脑上打开初始化的情况下出现了加载和绑定机器失败的问题。一般情况下,在实体机上用户进行登录后,用户的账号信息跟主机的机器码进行绑定然后保存到配置文件&a…

RNN文献综述

循环神经网络(Recurrent Neural Network,RNN)是一种专门用于处理序列数据的神经网络模型。它在自然语言处理、语音识别、时间序列预测等领域有着广泛的应用。本文将从RNN的历史发展、基本原理、应用场景以及最新研究进展等方面进行综述。 历…

阿里云RDS云数据库库表恢复操作

最近数据库中数据被人误删了,记录一下恢复操作方便以后发生时进行恢复. 1.打开控制台,进入云数据库实例. 2.进入实例后 ,点击右侧的备份恢复,然后看一下备份时间点,中间这边都是阿里云自动备份的备份集,基本都是7天一备…

免密ssh和自定义服务器名字【远程连接服务器】

免密ssh和自定义服务器名字【远程连接服务器】 免密ssh和自定义服务器名字【远程连接服务器】服务器添加本地公钥ssh-copy-id使用别名登录config 免密ssh和自定义服务器名字【远程连接服务器】 原理 实现免密登录需要 本地的公钥id_rsa.pub放在服务器上的 authorized_keys 文件…

实战演练:Fail2Ban部署全攻略,确保您的服务器免受CVE-2024-6387侵害!

Fail2Ban是一个开源的入侵防护软件,它可以扫描日志文件,识别恶意行为(如多次失败的登录尝试),并自动采取措施(如更新防火墙规则)来阻止攻击者。最近,CVE-2024-6387漏洞的爆出使我们更…

第一次的pentest show总结

第一次的pentest show总结 前言 开始之前,我特别感谢TryHackMe(英)、HackTheBox(美)、zero-point security(英)、offsec(美)等平台,使我们能够通过网络以线上的方式学习与练习,打破传统线下各地区教育资源差异大的限制,对网络教…