【QT】绘图

在这里插入图片描述

个人主页~


绘图

  • 一、绘图
    • 1、基础内容
    • 2、绘制形状
      • (1)线段
      • (2)矩形
      • (3)圆形
      • (4)文本
      • (5)画笔
      • (6)画刷
    • 3、绘制图片
      • (1)简单图片
      • (2)旋转图片
    • 4、其他
      • (1)移动画家位置
      • (2)保存、加载画家的状态
    • 5、其他
      • (1)QPixmap
      • (2)QImage
        • 修改像素点
      • (3)QPicture

一、绘图

1、基础内容

绘图可以帮助我们实现应对多种场景的功能,因为虽然Qt内部内置了很多控件,但是它们不能满足所有要求,我们就可以通过绘图来实现自定义图形

API核心类说明
QPainter用来绘画的对象,可以允许我们绘制各种图形
QPaintDevice描述QPainter把图形画到哪个对象上
QPen描述QPainter画出来的线
QBrush描述QPainter填充一个区域

一般绘图API的使用会放到paintEvent事件中,当控件首次创建控件被遮挡再解除遮挡窗口最小化再回复控件大小发生变化主动调用repaint或update方法时,paintEvent会被触发

2、绘制形状

下面只有线段是写在paintEvent里面的,其实它们都是要重写paintEvent函数的,为了简短表达,所以除了第一个其他的都没写出函数以及大括号和定义painter的部分

(1)线段

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//参数为坐标(QPoint)painter.drawLine(QPoint(30,20),QPoint(300,200));//参数两个一组,为坐标(int)painter.drawLine(40,50,400,500);
}

在这里插入图片描述

(2)矩形

//参数从左到右依次是窗口横坐标、窗口纵坐标、所绘制矩形的宽、所绘制矩形的高
painter.drawRect(20,20,200,50);

在这里插入图片描述

(3)圆形

//从左到右参数依次是圆心坐标,离圆心的x距离,离圆心的y距离
painter.drawEllipse(QPoint(100,100),100,100);

在这里插入图片描述

(4)文本

//设置字体
QFont font("楷体",30);
painter.setFont(font);
//设置画笔颜色
painter.setPen(Qt::blue);
//画文本
painter.drawText(QRect(50,100,800,200),"超级小小怪-s_little_monster");

在这里插入图片描述

(5)画笔

QPen类控制画笔,它定义了QPainter绘制什么样的形状、线条和轮廓,以及设置画笔的线宽、颜色、样式、画刷

画笔颜色可以在实例化画笔对象时进行设置,画笔的宽度是通过setWidth()方法进行设置,画笔的风格是通过setSytle()方法进行设置,设置画刷主要是通过setBrush()方法

//画笔颜色
QPen::QPen(const QColor& color);
//画笔宽度
void QPen::setWidth(int width);
//画笔风格
void QPen::setSytle(Qt::PenSytle style);

以下是画笔的风格:
在这里插入图片描述

(6)画刷

用QBrush类描述,大多用于填充,具有样式、颜色、渐变、纹理等属性
以下是画刷的风格:
在这里插入图片描述

//设置画笔
QPen pen(QColor(155,155,255));
//画笔宽度
pen.setWidth(5);
//画笔风格
pen.setStyle(Qt::DashLine);
//将画笔设置到画家手中
painter.setPen(pen);
//设置画刷,设置为青色(cyan)
QBrush brush(Qt::cyan);
//画刷风格
brush.setStyle(Qt::Dense1Pattern);
//画家拿画刷
painter.setBrush(brush);
//画圆
painter.drawEllipse(QPoint(200,200),100,100);

在这里插入图片描述

3、绘制图片

(1)简单图片

//移动图片基点(基点默认为左上角)
painter.translate(100,100);
//绘制图片
painter.drawPixmap(0,0,QPixmap(":/picture/slm.jpg"));
//移动图片基点+改变图片尺寸+绘制图片
painter.drawPixmap(300,400,60,40,QPixmap(":/picture/slm.jpg"));

在这里插入图片描述

(2)旋转图片

painter.translate(300,300);
//对坐标系进行180°旋转(顺时针)
painter.rotate(180);
//使原点从(300,300)移动回到(0,0)
painter.translate(-300,-300);
//画图片
painter.drawPixmap(0,0,QPixmap(":/picture/slm.jpg"));

在这里插入图片描述

这里详细解释一下,第一行代码将图片移动到(300,300)此时旋转的基点就是(300,300),旋转180°之后的图片是下面这样的
在这里插入图片描述
原来我们的坐标系是向上y减小,向左x减小,此时坐标系180°旋转,变成了向上y增大,向左x增大,所以现在将基点移动到(-300,-300)就是向下移动300个像素,向右移动300个像素

4、其他

(1)移动画家位置

painter.drawEllipse(QPoint(100,100),100,100);
//移动画家位置,此时(200,0)就是下个圆的(0,0)基点
painter.translate(200,0);
painter.drawEllipse(QPoint(100,100),100,100);

在这里插入图片描述

(2)保存、加载画家的状态

save函数保存画家状态
restore函数还原画家状态

比如上面的程序可以稍加改造

painter.drawEllipse(QPoint(100,100),100,100);
painter.translate(200,0);
//保存状态
painter.save();
painter.drawEllipse(QPoint(100,100),100,100);
painter.translate(200,0);
//恢复状态
painter.restore();
painter.drawEllipse(QPoint(100,100),100,100);

在这里插入图片描述

我们发现第三个圆没有出现,其实是跟第二个圆重叠了,就是因为画家恢复了状态,导致画家的移动失效了

5、其他

(1)QPixmap

//画布大小
QPixmap map(600,600);
//实例化画家
QPainter painter(&map);
//画笔颜色
painter.setPen(Qt::green);
//画圆
painter.drawEllipse(QPoint(100,100),100,100);
//保存绘制的图片
map.save("C:\\Users\\14725\\Desktop\\map.png");

在这里插入图片描述

(2)QImage

//设置画布大小以及绘图格式,绘图格式可在Qt助手中查看
QImage img(600,600,QImage::Format_RGB32);
//填充色为白色,默认为黑色
img.fill(Qt::white);
QPainter painter(&img);
//画笔颜色
painter.setPen(Qt::green);
//画圆
painter.drawEllipse(QPoint(100,100),100,100);
img.save("C:\\Users\\14725\\Desktop\\img.png");

在这里插入图片描述

修改像素点
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QImage img;img.load(":/picture/slm.jpg");//将长方形内的像素都改为红色for(int i = 100;i<300;i++){for(int j = 100;j <200;j++){QRgb rgb = qRgb(255,0,0);img.setPixel(i,j,rgb);}}//将这个图画出来painter.drawImage(0,0,img);
}

在这里插入图片描述

(3)QPicture

QPicture类似于游戏中的replay功能,replay可以通过记录地图中发生的所有事件,当回放replay的时候其实就是把上述记录的事件再一条一条的执行一遍就可以还原游戏场景了,这就大大节约了我们存储该内容的空间,当然它只能加载自己生成的文件,不能加载其他的文件

要使用begin和end配套,首先使用begin将QPicture实例作为参数传递进去,告诉系统开始记录,记录完毕后用end结束

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPicture picture;QPainter painter;//开始在画布上画画painter.begin(&picture);//设置画笔颜色painter.setPen(Qt::red);painter.drawEllipse(QPoint(100,100),100,100);//结束画画painter.end();picture.save("C:\\Users\\14725\\Desktop\\picture.pic");
}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//重现画图指令QPicture picture;picture.load("C:\\Users\\14725\\Desktop\\picture.pic");//加载图片painter.drawPicture(0,0,picture);
}

在这里插入图片描述
在这里插入图片描述
后缀为pic无法直接打开,只能通过重现绘图指令来打开


今日分享就到这了~

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quality minus junk论文阅读

Quality minus junk论文阅读 文章目录 Quality minus junk论文阅读 AbstractTheoretical FrameworkEmpirical AnalysisDataQuality scorePortfoliosEx ante quality forecasts fundamentals Results and DiscussionThe price of qualityUnderstanding the price of quality: th…

葡萄酒(wine)数据集——LDA、贝叶斯判别分析

1 葡萄酒(wine)数据集介绍 葡萄酒识别数据集(Wine Recognition dataset)通常用于多类别分类问题建模。数据集包括从三个不同的品种(类别)的葡萄酒中测得的13种不同的化学特征,共178个样本。这些化学特征包括酸度、灰分、酒精浓度等。 该数据集是由UCI机器学习库提供,并…

贪心算法 -- 递增子序列

目录 最长递增子序列 题解&#xff1a; 代码&#xff1a; 递增的三元子序列 题解&#xff1a; 代码&#xff1a; 简易版&#xff1a; 最长连续递增序列 题解&#xff1a; 代码&#xff1a; 最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xf…

【ArcGIS微课1000例】0132:从多个GIS视角认识与攀登珠穆朗玛峰

文章目录 1. Map Viewer中打开2. 场景查看器中打开3. ArcGIS中打开4. QGIS中打开5. Globalmapper中打开6. ArcGIS Earth中打开官网地址:https://www.arcgis.com/home/item.html?id=504a23373ab84536b7760c0add1e0c1c 1. Map Viewer中打开 以下展示不同底图样式的珠穆朗玛峰壮…

如何在Word文件中设置水印以及如何禁止修改水印

在日常办公和学习中&#xff0c;我们经常需要在Word文档中设置水印&#xff0c;以保护文件的版权或标明文件的机密性。水印可以是文字形式&#xff0c;也可以是图片形式&#xff0c;能够灵活地适应不同的需求。但仅仅设置水印是不够的&#xff0c;有时我们还需要确保水印不被随…

windows的WSL Ubuntu子系统重置root或其他用户的密码

思路&#xff1a;以管理员身份运行PowerShell&#xff0c;在命令行窗口重置密码 &#xff0c;不需要删除或重新安装Linux子系统。 1、以管理员身份运行PowerShell 2、用root用户启动Ubuntu&#xff0c;执行 wsl.exe --user root 3、重置密码&#xff0c;执行passwd username&…

UE5 5.1.1创建C++项目,显示error C4668和error C4067的解决方法

因为工作要求&#xff0c;没法使用最新 5.5版本的ue5 而是要用ue5.1和5.2版本。 但是我在安装下载了visual studio2022后&#xff0c;使用 ue5.1编辑器 创建C项目&#xff0c;爆出如下错误。 error C4668: ?????__has_feature?????ΪԤ?????꣬???0????…

SpringCloud多机部署,负载均衡-LoadBalance

一.负载均衡 1.1问题描述 //根据应用名称获取服务列表 List<ServiceInstance> instancesdiscoveryClient.getInstances("product-service"); //一个微服务可能有多个实例&#xff0c;获取第一个 EurekaServiceInstance instance(EurekaServiceInstance)insta…

『 Linux 』文件与网络套接字的内部关系

文章目录 回顾进程控制块socket与文件的关系wait_queue_head_t文件与套接字相关的调用方法系统中的套接字网络协议栈与方法集报文的管理 回顾进程控制块 每个进程都存在着自己的PCB结构体,即task_struct结构体,这个结构体是用来描述一个进程的; /* 已省略部分代码 */ struct t…

科研实验室的数字化转型:Spring Boot系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理实验室管理系统的相关信息成为必然。开发合…

【前端】CSS修改div滚动条样式

示例 分别是滚动条默认样式和修改后的样式 代码 <div class"video-list"><div class"list-item" onclick"videoinfo(100)"><img src"/index/images/coverimg/方和谦.png"><div class"txt">国医大…

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词英文模板&#x1f4af;提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…

centos安装jenkins

本机使用虚拟机centos 7.9.2009 安装gitlab&#xff0c;本机的虚拟机ip地址是 192.168.60.151&#xff0c; 步骤记录如下 1、下载jenkins&#xff0c;安装jenkins之前需要安装jdk jdk和jenkins的版本对应关系参考&#xff1a;Redhat Jenkins Packages Index of /redhat-stable…

使用redis-shake工具进行redis的数据同步

前言&#xff1a; 工作中将常遇到测试环境和正式环境的数据同步或者需要进行数据迁移&#xff0c;对于mysql数据库的方案倒是不少&#xff0c;但是redis中如何快速便捷的迁移呢&#xff1f;答案是阿里云提供的:redis-shake RedisShake是阿里云基于豌豆荚开源的redis-port进行…

04 —— Webpack打包CSS代码

加载器css-loader &#xff1a;解析css代码 webpack 中文文档 | webpack中文文档 | webpack中文网 加载器style-loader&#xff1a;把解析后的css代码插入到DOM style-loader | webpack 中文文档 | webpack中文文档 | webpack中文网 准备css代码&#xff0c;放到src/login目…

Nacos实现IP动态黑白名单过滤

一些恶意用户&#xff08;可能是黑客、爬虫、DDoS 攻击者&#xff09;可能频繁请求服务器资源&#xff0c;导致资源占用过高。因此我们需要一定的手段实时阻止可疑或恶意的用户&#xff0c;减少攻击风险。 本次练习使用到的是Nacos配合布隆过滤器实现动态IP黑白名单过滤 文章…

SAP PI/PO Proxy2JDBC SQL_QUERY动态接口示例

目录 背景&#xff1a; 完整demo步骤&#xff1a; IR: ID: SPROXY: 测试代码&#xff1a; 注意点&#xff1a; 背景&#xff1a; 中途临时帮客户项目做其他功能&#xff0c;项目上有部分开发项需要通过PO去第三方数据库取数&#xff0c;项目上的开发对PO不太熟&#xf…

如何使用本地大模型做数据分析

工具&#xff1a;interpreter --local 样本数据&#xff1a; 1、启动分析工具 2、显示数据文件内容 输入&#xff1a; 显示/Users/wxl/work/example_label.csv 输出&#xff1a;(每次输出的结果可能会不一样&#xff09; 3、相关性分析 输入&#xff1a; 分析客户类型与成…

中间件--laravel进阶篇

laravel版本11.31,这中间件只有3种,分别是全局中间件,路由中间件,控制器中间件。相比thinkphp8,少了一个应用中间件。 一、创建中间件 laravel创建中间件可以使用命令的方式创建,非常方便。比如php artisan make:middleware EnsureTokenIsValid。EnsureTokenIsValid是中间…

一维卷积神经网络(1D-CNN)

一维卷积神经网络&#xff08;1D Convolutional Neural Network, 1D CNN&#xff09;是卷积神经网络的一种变体&#xff0c;专门用于处理序列数据&#xff0c;如时间序列、文本等。 一、基本结构 一维卷积神经网络的基本结构与二维卷积神经网络&#xff08;2D CNN&#xff09;类…