当前位置: 首页 > news >正文

【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无法直接打开,只能通过重现绘图指令来打开


今日分享就到这了~

在这里插入图片描述

相关文章:

【QT】绘图

个人主页~ 绘图 一、绘图1、基础内容2、绘制形状&#xff08;1&#xff09;线段&#xff08;2&#xff09;矩形&#xff08;3&#xff09;圆形&#xff08;4&#xff09;文本&#xff08;5&#xff09;画笔&#xff08;6&#xff09;画刷 3、绘制图片&#xff08;1&#xff09;…...

vue3+elementui-plus el-dialog全局配置点击空白处不关闭弹窗

在与main.ts同级下的plugins文件夹&#xff08;如果没有&#xff0c;新建一个&#xff09;下建一个element.js文件&#xff08;名字随便取&#xff09; element.js文件内容如下&#xff1a; import ElementPlus from element-plus export default (app) > {console.log(app…...

Markdown语法说明

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

推荐一款专业电脑护眼工具:CareUEyes Pro

CareUEyes Pro是一款非常好用的专业电脑护眼工具&#xff0c;软件小巧&#xff0c;界面简单&#xff0c;它可以自动过滤电脑屏幕的蓝光&#xff0c;让屏幕显示更加的不伤眼&#xff0c;更加舒适&#xff0c;有效保护你的眼睛&#xff0c;可以自定义调节屏幕的色调&#xff0c;从…...

对subprocess启动的子进程使用VSCode python debugger

文章目录 1 情况概要&#xff08;和文件结构&#xff09;2 具体设置和启动步骤2.1 具体配置Step 1 针对attach debugger到子进程Step 2 针对子进程的暂停(可选) Step 3 判断哪个进程id是需要的子进程 2.2 启动步骤和过程 3 其他问题解决3.13.2 ptrace: Operation not permitted…...

Django启用国际化支持(2)—实现界面内切换语言:activate()

文章目录 ⭐注意⭐1. 配置项目全局设置&#xff1a;启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…...

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器&#xff0c;由七个电路模块组成&#xff0c;分别是&#xff1a;单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中&#xff0c;单片机模块是整个…...

VSCode 如何选中包含某个字母的所有行

文章目录 写在前面一、需求描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a;VSCode 一、需求描述 由于需要处理文件&#xff0c;需求是删除文件中包含某个字母的所有行。 二、解决方法 在 Visual Studio Code (VSCode) 中&#xff0c;如果你想选中所有包含某…...

CSRF保护--laravel进阶篇

laravel对csrf非常重视&#xff0c;专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久&#xff0c;那么您可能对于web.php路由文件的post请求很疑惑&#xff0c;因为get请求很顺利&#xff0c;而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…...

计算机网络-理论部分(二):应用层

网络应用体系结构 Client-Server客户-服务器体系结构&#xff1a;如Web&#xff0c;FTP&#xff0c;Telnet等Peer-Peer&#xff1a;点对点P2P结构&#xff0c;如BitTorrent 应用层协议定义了&#xff1a; 交换的报文类型&#xff0c;请求or响应报文类型的语法字段的含义如何…...

k8s1.31版本最新版本集群使用容器镜像仓库Harbor

虚拟机 rocky9.4 linux master node01 node02 已部署k8s集群版本 1.31 方法 一 使用容器部署harbor (1) wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl enable docker…...

QT中使用json格式存取矩阵数据

在 Qt 中,可以通过 QJsonDocument 和 QJsonArray 方便地存取 JSON 格式的矩阵数据。以下是存储和读取矩阵数据的完整实现示例。 1. 矩阵存储为 JSON 将矩阵(QVector<QVector<double>> 或其他二维数组)存储为 JSON 文件。 实现代码 #include <QJsonArray&g…...

k8s 集群安装

安装rockylinux https://www.jianshu.com/p/a5fe20318b8e https://www.cnblogs.com/haoee/p/18290506 配置VirtualBox双网卡 https://www.cnblogs.com/ShineLeBlog/p/17580311.html https://zhuanlan.zhihu.com/p/341328334 https://blog.csdn.net/qq_36544785/article/deta…...

Elasticsearch面试内容整理-核心概念与数据模型

在 Elasticsearch 中,理解核心概念与数据模型是非常重要的,因为它们定义了数据如何被组织、存储和搜索。以下是 Elasticsearch 的核心概念和数据模型的详细介绍。 核心概念 集群(Cluster) ● 集群是由一个或多个节点组成的,用于共同存储和搜索数据的集合。...

Spring Boot实现License生成和校验

Spring Boot实现License生成和校验 证书准备 # 1. 生成私钥库 # validity&#xff1a;私钥的有效期&#xff08;天&#xff09; # alias&#xff1a;私钥别称 # keystore&#xff1a;私钥库文件名称&#xff08;生成在当前目录&#xff09; # storepass&#xff1a;私钥库密码…...

es写入磁盘的过程以及相关优化

数据写入到内存buffer同时写入到数据到translog buffer,这是为了防止数据不会丢失每隔1s数据从buffer中refresh到FileSystemCache中,生成segment文件,这是因为写入磁盘的过程相对耗时,借助FileSystemCache,一旦生成segment文件,就能通过索引查询到了refresh完,memory bu…...

十大网络安全事件

一、私有云平台遭攻击&#xff0c;美国数千家公司工资难以发放 1月&#xff0c;专门提供劳动力与人力资本管理解决方案的美国克罗诺斯&#xff08;Kronos&#xff09;公司私有云平台遭勒索软件攻击&#xff0c;事件造成的混乱在数百万人中蔓延。 克罗诺斯母公司UKG集团&#xf…...

【数据结构】【线性表】栈的基本概念(附c语言源码)

栈的基本概念 讲基本概念还是回到数据结构的三要素&#xff1a;逻辑结构&#xff0c;物理结构和数据运算。 从逻辑结构来讲&#xff0c;栈的各个数据元素之间是通过是一对一的线性连接&#xff0c;因此栈也是属于线性表的一种从物理结构来说&#xff0c;栈可以是顺序存储和顺…...

修改ffmpeg实现https-flv内容加密

目录 1 前言 2 ffmpeg源码修改 2.1 增加头文件 2.2 http上下文增加解密密钥和AVAESCTR结构体 2.3 aes解密上下文初始化 2.4 对http数据部分解密 2.5 http关闭时清理资源 3 ffmpeg使用 1 前言 当前视频拉流已经通过URL鉴权方式来对访客身份进行识别和过滤&#xff0c;但…...

react中useMemo的使用场景

useMemo 是 React 的一个 Hook&#xff0c;用来优化性能&#xff0c;尤其是在计算复杂值时。它会记住&#xff08;缓存&#xff09;计算结果&#xff0c;只有在依赖项变化时才重新计算&#xff0c;避免不必要的重复计算。 import React, { useMemo } from react; function Ex…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

比特币:固若金汤的数字堡垒与它的四道防线

第一道防线&#xff1a;机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”&#xff08;Hashing&#xff09;就是一种军事级的加密术&#xff08;SHA-256&#xff09;&#xff0c;能将信函内容&#xff08;交易细节&#xf…...

基于 HTTP 的单向流式通信协议SSE详解

SSE&#xff08;Server-Sent Events&#xff09;详解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 标准中定义的一种通信机制&#xff0c;它允许服务器主动将事件推送给客户端&#xff08;浏览器&#xff09;。与传统的 H…...