Qt Quick系列(9)—初识画布

news2024/11/26 1:41:41

🚀作者:CAccept
🎂专栏:Qt Quick
在这里插入图片描述

文章目录

  • 前言
  • 代码示例1
    • 源码
    • 关键知识点
  • 代码示例2
    • 源码
    • 关键知识点
  • 总结

前言

画布元素的基本思想是使用上下文2D对象(ctx)渲染路径。上下文2D对象包含必要的图形功能,而画布充当绘图画布。
在QML中,画布元素(canvas element)充当了绘制的容器。2D绘制对象(ctx)提供了实际绘制的方法。绘制需要在onPaint中完成,接下来将通过两个代码示例来说明画布元素应该怎么用👇

本博客中工程使用的环境为:qt6 + Qt Creator10.0.1


代码示例1

在这个代码中主要是讲解怎么进行对画布的基本操作:获取上下文设置画笔的各种属性画笔的移动绘制图片以及渐变色的使用。可以先看下代码,代码中的注释也已经很清楚了,后续也有对一些知识点的总结。

源码

import QtQuick 2.12
import QtQuick.Window 2.12

//画布
Canvas
{
    id:root
    width: 200;
    height: 200;
    onPaint:
    {
        //获取上下文对象
        var ctx = getContext("2d")
        //设置线条宽度
        ctx.lineWidth = 4
        //边框颜色
        ctx.strokeStyle="blue"
        //内部颜色
        ctx.fillStyle = "steelblue"
        //对上面的设置进行保存
        ctx.save()
        ctx.fillStyle = "red"
        //开始第一个阶段的绘制
        ctx.beginPath()
        //将笔移动到(50,50)位置
        ctx.moveTo(50,50);
        //画线
        ctx.lineTo(150,50);
        ctx.lineTo(150,150);
        ctx.lineTo(50,150);
        //将上面画的线围成一篇区域变成一个正方形进行绘制
        ctx.fill()
        ctx.closePath();
        ctx.beginPath();
        //轮廓线的颜色改为“红色”
        //画起点20,20,宽高各80的矩形
        ctx.fillRect(20,20,80,80);
        //起点30,30宽高60的区域内进行镂空
        ctx.clearRect(30,30,60,60);
        //用笔尖描出来的矩形
        ctx.strokeRect(20,20,40,40);
        ctx.closePath()

        //将保存的信息进行加载
        ctx.restore()
        ctx.fillRect(10,10,20,20);

        //创建线性渐变,从(0,0)开始到(0,height)进行渐变(其实就是整个画布的区域)
        var gradient = ctx.createLinearGradient(0,0,0,root.height)
        gradient.addColorStop(0,"blue");
        gradient.addColorStop(1,"lightblue");
        ctx.fillStyle=gradient
        ctx.fillRect(50,50,100,100);
        ctx.fillRect(100,0,100,100);
        ctx.fillRect(0,100,100,100);

        //对创建好的路径进行填充操作,将路径内部的区域填充上指定的颜色或样式。
        ctx.fill()
        //对创建好的路径进行填充操作,将路径内部的区域填充上指定的颜色或样式。
        ctx.stroke();
    }

}

运行效果:
在这里插入图片描述

关键知识点

1、在进行位置设置(moveTo)或者是线条(lineTo)设置时,可以采用beginPath和closePath进行分段,在内部设置

ctx.beginPath()
//将笔移动到(50,50)位置
ctx.moveTo(50,50);
//画线
ctx.lineTo(150,50);
ctx.lineTo(150,150);
ctx.lineTo(50,150);
//将上面画的线围成一篇区域变成一个正方形进行绘制
ctx.fill()
ctx.closePath();

2、保存设置和恢复保存的设置使用save和restore

//保存前面的设置
ctx.save()
...
...
//恢复设置
ctx.restore()

3、ctx.fill()的作用是对创建好的路径进行填充操作,将路径内部的区域填充上指定的颜色或样式,ctx.stroke()是对外部轮廓填充上制定的颜色和样式,分别使用ctx.fillStyle和ctx.strokeStyle进行设置。


代码示例2

在这个代码中主要实现的功能是实现类似画图软件的选择颜色画线功能,选择指定的颜色,画笔的颜色就会发生改变。

源码

ColorSquare.qml

import QtQuick 2.0
import QtQuick.Controls 2.0
Button
{
    width: 100;
    height: 100
    property alias color: bg.color
    Rectangle
    {
        id:bg
        width: 80
        height: 80
        opacity:0.7
        anchors.centerIn: parent
    }
}

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0
Rectangle
{
    width:500
    height:500

    Row{
        id:colorTools
        anchors
        {
            horizontalCenter:parent.horizontalCenter
            top:parent.top
            topMargin:8
        }
        property color paintColor: "blue"
        Repeater
        {
            model:['blue','gray','yellow','green']
            ColorSquare{
                color:modelData
                //看它是否为color来决定是否要放下去
                down:parent.paintColor===color
                onClicked: parent.paintColor=color
            }
        }

    }

    Canvas{
        id:canvas
        anchors
        {
            left:parent.left
            right:parent.right
            top:colorTools.bottom
            bottom:parent.bottom
            margins:8
        }
        property real lastY
        property real lastX
        property color color:colorTools.paintColor
        onPaint:
        {
            var ctx = getContext("2d")
            ctx.lineWidth = 1.5
            ctx.strokeStyle=canvas.color
            ctx.beginPath()
            ctx.moveTo(lastX,lastY)
            lastX = area.mouseX
            lastY=area.mouseY
            ctx.lineTo(lastX,lastY)
            ctx.stroke()
        }


        MouseArea{
            id:area
            anchors.fill:parent
            onPressed:
            {
                canvas.lastX=mouseX;
                canvas.lastY=mouseY;
            }
            //当鼠标位置发生改变就重新绘制一遍(再次执行onPaint)
            onPositionChanged:canvas.requestPaint();
        }
    }
}

运行效果:
在这里插入图片描述

关键知识点

1、使用canvas.requestPaint()的话,就会重新触发一次onPaint

MouseArea{
    id:area
    anchors.fill:parent
    onPressed:
    {
        canvas.lastX=mouseX;
        canvas.lastY=mouseY;
    }
    //当鼠标位置发生改变就重新绘制一遍(再次执行onPaint)
    onPositionChanged:canvas.requestPaint();
}

2、Button有down方法,这样颜色会加深一些,可以区别于那些没有down的按钮,以下就是第一个按钮有down的情况👇
在这里插入图片描述


总结

本篇博客到此结束,感谢您看到这,希望本篇文章对您能够有所帮助,有疑问或者是文章本身存在问题的话请在评论区中提出来,谢谢(*^_^*)
在这里插入图片描述

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

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

相关文章

一文读懂FPC(12)- FPC的阻抗控制

FPC系列文章目录 1.什么是FPC 2.什么是R-FPC 3,FPC的基材 4.FPC基材压延铜和电解铜的区别 5,FPC的辅材 6,FPC常见的四种类型 7,FPC的生产流程简介 8,R-FPC的生产流程简介 9,FPC的发展及应用 10&a…

Vue :在 VSCode 中安装 yarn 并用 yarn 工具来控制 Vue 项目的详细过程

Ⅰ、 Yarn 工具简介: 1、什么是 yarn 工具: Yarn 是 facebook 发布的一款取代 npm 的资源包管理工具,是一个快速、可靠、安全的依赖管理工具,一款新的 JavaScript 资源包管理工具(吐槽下:最大的弊端是,要通过 npm 来…

java中的String使用注意事项、StringBuilder、StringBuffer、StringJoiner

String使用注意事项 这里第二次创造了0个对象是因为字符串常量池中已经有"abc" StringBuilder 注意StringBuilder支持链式编程 StringBuilder s new StringBuilder("abc"); s.append(666).append("acb" ).append(666); System.out.printl…

89、基于STM32单片机激光测距仪远距离倒车防撞报警器系统设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&a…

操作系统8:存储器的层次结构及程序的装入和链接

目录 1、存储器的层次结构 (1)多层结构的存储器系统 1.1 - 存储器的多层结构 1.2 - 可执行存储器 (2)主存储器与寄存器 2.1 - 主存储器 2.2 - 寄存器 (3)高速缓存和磁盘缓存 3.1 - 高速缓存 3.2 …

使用wordpress搭建WebStack导航网站记录

0 序言 首先,我来介绍下,这个webstack导航网站实际上是被做成了wordpress的一个主题,具体这个主题的下载地址如下: WordPress 版 WebStack 导航主题https://github.com/owen0o0/WebStack 我们不需要使用git clone命令&…

【观察者模式】 ——每天一点小知识

💧 观察者模式 \color{#FF1493}{观察者模式} 观察者模式💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 《数据结构与算法》专栏的文章图文并茂🦕…

uni-calendar 日历控件自定义点的颜色功能

增加自定义点的颜色功能,官方空间点的颜色是固定红色 1、修改的页面 uni-calendar-item 在uni-calendar-item页面中的这个标签中加上一个style属性,判断传过来的参数是否存在bgcolor背景颜色,有的话添加背景色,没有则不添加默认系…

【DBA课程-笔记】第 4 章:MongoDB数据库管理备份

课程大纲 MongoDB备份机制数据库的恢复数据库的导出数据库的导入MongoDB面试题 一、MongoDB备份机制 1. MongoDB备份方式 磁阵列文件系统快照 Filesystem Snapshots复制数据文件 CPmongodump 备份 和 mongorestore 恢复工具mongoimport 导入 和 mongoexport 导出工具MongoD…

Qt - 模型视图

模型/视图 概念 模型/视图结构将数据存储和界面展示分离,分别用不同的类实现 模型:存储数据视图:界面上的视图组件显示模型中的数据;在视图组件里修改的数据会被自动保存在模型中 源数据 内存中的一个字符串列表 磁盘文件系统结构…

【二叉树part08】| 669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 🎈LeetCode669. 修剪二叉搜索树 🎈LeetCode108.将有序数组转换为二叉搜索树 🎈LeetCode538.把二叉搜索树转换为累加树 🎈LeetCode669. 修剪二叉搜索树 链接:669.修剪二叉搜索树 给你二叉搜索树的根节点 root…

用于 3D 建模和渲染应该选择怎么样的配置?

选择合适的机器可能会使决定变得困难。在分析图像时,它还需要一定数量的核心和线程,这绝对是一个怪物。渲染一般是使用GPU或者CPU来进行,从而产生渲染效果。 3D 建模是一种用于构建和评估实际物理对象的虚拟 3D 模型的应用程序。该技术应用于…

Mvc进阶(下)

Mvc进阶(下) 1.前言2.上次代码弊端1.利用xml建模反射优化1.XMl文件2.对xml建模 3.修改中央控制器 3.再优化1.先优化Action子控制器4.优化传值问题 4.总结 1.前言 虽然前面文章深入解析Java自定义MVC框架的原理与实现讲述了Mvc框架,但是那只能…

suse ha for sap scale-up性能优化场景安装配置

1. 安装SUSE操作系统 在官网下载SUSE Linux Enterprise Server for SAP Applications安装介质,在安装操作系统过程中,选择SUSE Linux Enterprise Server for SAP Applications操作系统。 在软件选择界面,根据需要选择SAP HANA Server Base…

oracle connect by很强,但是要慎用,不然有你哭的时候

前言: 第四次工业革命,带来了科技的巨大变更,同时带来了很多半结构化数据,很多数据会做成集合、JSON的形式存储到数据库中,通过ETL工具我们将这些数据抽取到数仓里面,我们怎么进行分析呢?这些数据类似这样的…

centos7安装git及maven

安装git 直接使用yum安装,指令如下: yum install git然后执行如下指令判断是否安装完成: git --version紧接着需要维护git的用户名及邮箱等信息 git config --global user.name "zzy" git config --global user.email "ex…

JS知识点汇总(十四)--事件循环

1. 对事件循环的理解 JavaScript 在设计之初便是单线程,即指程序运行时,只有一个线程存在,同一时间只能做一件事 JavaScript 初期作为一门浏览器脚本语言,通常用于操作 DOM ,如果是多线程,一个线程进行了删…

QT学习笔记:调整控件大小和位置

前面的文章,我讲了怎么用layout去布局。但布局做完后,发现界面有点怪。比如,最低下的“清除”按钮这么大,“消息体”这个label没有位于中间等。下面,我就来讲下怎么把界面继续优化。 1、调整“清除”按钮大小和位置 …

第八步:STM32F4 EXTI

1.0 外部中断概述 STM32F4的每个IO都可以作为外部中断输入。 STM32F4的中断控制器支持22个外部中断/事件请求: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18&#xff1…

Kubernetes(k8s)实战:Kubernetes(k8s)部署Springboot项目

文章目录 一、练手:k8s部署部署wordpressmysql1、创建wordpress命名空间2、创建mysql数据库3、创建wordpress应用4、小结 二、实战:部署自己的springboot项目1、准备一个springboot项目2、使用docker打成镜像3、使用k8s部署springboot 三、实战&#xff…