Qt桌面应用开发 第七天(绘图事件 绘图设备)

目录

1.绘图事件paintEvent

2.高级绘图

3.图片绘制

4.绘图设备

4.1QPixmap

4.2QBitmap

4.3QImage

4.4QPicture


1.绘图事件paintEvent

  • paintEvent——绘图事件

需求:利用QPainter绘制点、线、圆、矩形、文字;设置画笔改为红色,宽度为2,;设置画刷为蓝色,用于填空圆和矩形

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//设置画笔QPen pen(QColor(255,0,0));pen.setWidth(2);pen.setStyle(Qt::DotLine);//虚线painter.setPen(pen);//设置画刷QBrush brush(Qt::blue);brush.setStyle(Qt::Dense5Pattern);painter.setBrush(brush);painter.drawPoint(100,20);painter.drawLine(QPoint(0,0),QPoint(100,100));painter.drawEllipse(QPoint(100,100),50,50);painter.drawRect(QRect(20,20,50,50));painter.setFont(QFont("黑体",20));painter.drawText(QRect(0,200,150,100),"好好学习,天天向上");
}

2.高级绘图

绘图设备是指继承QPainterDevice的子类,如QPixmap、QBitmap、QPicture

需求1::绘制两个原型,一个普通,一个抗锯齿效果

void Widget::paintEvent(QPaintEvent* event)
{QPainter painter(this);painter.drawEllipse(QPoint(100,100),50,50);//抗锯齿painter.setRenderHint(QPainter::Antialiasing);painter.drawEllipse(QPoint(250,100),50,50);
}

 

需求2:

void Widget::paintEvent(QPaintEvent* event)
{QPainter painter(this);painter.drawRect(QRect(20,20,50,50));painter.translate(100,0);painter.drawRect(QRect(20,20,50,50));painter.save();
}

 需求3:再次移动画家,restore恢复画家状态,绘制矩形Qrect(20,20,50,50)

void Widget::paintEvent(QPaintEvent* event)
{QPainter painter(this);painter.translate(100,0);painter.restore();painter.drawRect(QRect(20,20,50,50));
}

3.图片绘制

绘制图片,也就是将已有资源图片,绘制到窗口中,利用QPainter在QLabel上绘制图片,主要调用drawPixmap

void QPainter::drawPixmap(int x,int y,const QPixmap &pixmap);
void Widget::paintEvent(QPaintEvent* event)
{QPainter painter(this);QPixmap pix;pix.load(":/Image/1.png");painter.drawPixmap(0,0,pix);
}
  • update()——手动更新绘制事件

4.绘图设备

4.1QPixmap

适用于图像在屏幕上的显示,继承QPaintDevice

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPixmap pix(300,300);//填充背景色pix.fill(Qt::white);QPainter paint(&pix);paint.setPen(QPen(Qt::green));//画圆paint.drawEllipse(QPoint(150,150),100,100);//保存在磁盘中pix.save("E:\\a\\pix.png");
}
  • pix.fill(Qt::white);             //填充背景色

效果如下:

4.2QBitmap

继承QPixmap,色深是1(只能用一位二进制数表示颜色,即0或1),即表示的颜色只有两种,黑和白,占用存储空间很少,故适合做光标文件和笔刷。

void Widget::paintEvent(QPaintEvent *event)
{QBitmap bitmap1(":/Image/butterfly.png");QBitmap bitmap2(":/Image/butterfly1.png");QPainter painter(this);painter.drawPixmap(0,50,bitmap1);painter.drawPixmap(200,50,bitmap2);
}

效果如下:

4.3QImage

适用于图像的像素级访问

  • setPixel()或pixel()——存取指定的像素
  • fromImage()【QPixmap静态成员函数】——QImage转QPixmap
  • toImage()【QPixmap的成员函数】——QPixmap转QImage

需求1:用QImage显示一张图

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QImage image(300,300,QImage::Format_RGB32);//填充背景色image.fill(Qt::white);QPainter paint(&image);paint.setPen(QPen(Qt::green));//画圆paint.drawEllipse(QPoint(150,150),100,100);//保存在磁盘中image.save("E:\\Qt project\\pix2.png");
}

效果如下:

需求2:将50-100像素的点改为红色

void Widget::paintEvent(QPaintEvent* event)
{QPainter painter(this);QImage image;image.load("E:\\Qt project\\pix2.png");for(int i=50;i<=100;i++){for(int j=50;j<=100;j++){//红色QRgb val=qRgb(255,0,0);//将坐标为(i,j)的设置为红色image.setPixel(i,j,val);}}painter.drawImage(0,0,image);
}

 效果如下:

4.4QPicture

可以记录和重现QPainter的各条命令

操作步骤:

  1. 使用QPainter::begin(),将QPicture实例作为参数传递进去,告诉系统开始记录
  2. QPainter::end()将命令终止

需求:用QPicture记录绘图指令,在paintEvent中重现绘图指令

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPicture pic;QPainter painter;//记录绘图指令painter.begin(&pic);painter.setPen(QPen(Qt::red));painter.drawEllipse(QPoint(150,150),100,100);painter.end();//后缀picpic.save("E:\\Qt project\\pix3.pic");
}void Widget::paintEvent(QPaintEvent* event)
{QPainter painter(this);QPicture pic;pic.load("E:\\Qt project\\pix3.pic");//重现绘图步骤painter.drawImage(0,0,pic);
}

效果如下:

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

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

相关文章

使用IDEA构建springboot项目+整合Mybatis

目录 目录 1.Springboot简介 2.SpringBoot的工作流程 3.SpringBoot框架的搭建和配置 4.用Springboot实现一个基本的select操作 5.SpringBoot项目部署非常简单&#xff0c;springBoot内嵌了 Tomcat、Jetty、Undertow 三种容器&#xff0c;其默认嵌入的容器是 Tomcat&#xff0c;…

【含开题报告+文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现

开题报告 随着互联网的普及和数字娱乐产业的蓬勃发展&#xff0c;电影作为一种重要的娱乐方式&#xff0c;已经深入人们的日常生活。然而&#xff0c;面对海量的电影资源&#xff0c;用户在选择观影内容时常常感到困惑和无所适从。传统的电影推荐方式&#xff0c;如人工筛选、…

C++使用minio-cpp(minio官方C++ SDK)与minio服务器交互简介

目录 minio简介minio-cpp简介minio-cpp使用 minio简介 minio是一个开源的高性能对象存储解决方案&#xff0c;完全兼容Amazon S3 API&#xff0c;支持分布式存储&#xff0c;适用于大规模数据架构&#xff0c;容易集成&#xff0c;而且可以方便的部署在集群中。 如果你已经部…

【君正T31开发记录】8.了解rtsp协议及设计模式

前边搞定了驱动&#xff0c;先不着急直接上手撸应用层的代码&#xff0c;先了解一下大致要用到的东西。 设计PC端先用vlc rtsp暂时H264编码&#xff08;vlc好像不支持h265,这个后边我试试&#xff09;的视频流&#xff0c;先需要支持上rtsp server&#xff0c;了解rtsp协议是必…

JavaScript中的this指向绑定规则(超全)

JavaScript中的this指向绑定规则&#xff08;超全&#xff09; 1.1 为什么需要this? 为什么需要this? 在常见的编程语言中&#xff0c;几乎都有this这个关键字&#xff08;Objective-C中使用的是self),但是在JavaScript中的this和常见的面向对象语言中的this不太一样 常见面…

Spring注入Map学习

Spring注入Map学习 在Spring中 在策略模式中, 会经常用到 根据Bean名称获取Bean的实例 有2个方法很好用 1. 使用Autowired注入 2. 使用构造方法注入 但是奇怪的一点是: 日志打印并没有看到结果, 第一行的 Autowired的结果 是个null 那是因为 注入时机 的问题 注入时机&…

Redis五大基本类型——Set集合命令详解(命令用法详解+思维导图详解)

目录 一、Set集合类型介绍 二、常见命令 1、SADD 2、SMEMBERS 3、SISMEMBER 4、SCARD 5、SRANDMEMBER 6、SPOP 7、SMOVE 8、SREM ​编辑 9、集合间操作 &#xff08;1&#xff09;SINTER &#xff08;2&#xff09;SINTERSTORE &#xff08;3&#xff09;SUNION…

sql 查询语句:将终端数据形式转换成insert语句

文本转换&#xff1a;sql 查询语句&#xff1a;将终端数据形式转换成insert语句 如上&#xff0c;写过后端的都知道&#xff0c;从生产或其他地方拿到的数据&#xff0c;有可能会是图一&#xff1b;但实际上&#xff0c;我们需要图二的数据&#xff1b; 不废话&#xff0c;直接…

后端开发入门

后端开发最佳实践详解 1. 引言 后端开发不仅仅是编写功能代码&#xff0c;还涉及到如何构建稳定、可靠且高效的系统。掌握后端开发的最佳实践&#xff0c;可以帮助您避免常见的错误&#xff0c;提高代码质量&#xff0c;确保应用的可维护性和扩展性。以下内容将详细讲解这些关…

Ajax入门程序

前端和后台本来是没有联系的&#xff0c;前端想要从后台获取数据&#xff0c;就必须涉及到两个程序的交互&#xff0c;而Ajax就是用于完成两端交互的技术。 Ajax&#xff1a;Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 异步交互&#xff1a;可以在不…

详解Qt 中使用虚拟键盘(软键盘qtvirtualkeyboard)

文章目录 详解 Qt 中使用虚拟键盘&#xff08;软键盘&#xff1a;QtVirtualKeyboard&#xff09;1. 虚拟键盘简介1.1 虚拟键盘的应用场景 2. 安装和配置2.1 安装 QtVirtualKeyboard2.2 配置环境变量 3. 使用虚拟键盘3.1 示例代码main.cppwidget.hwidget.cpp 4. 总结 详解 Qt 中…

第2.7节 AIGC+学术论文——选题与定位(二)

2.1 选题与定位 主题确定&#xff1a;选择一个既符合学术兴趣又具有研究价值的主题。 身份背景研究领域问题具体化使用AI搜索&#xff1a;文献回顾最新研究选题可行性与实际应用迭代 2.2.1身份背景研究领域问题具体化 &#xff08;一&#xff09;身份背景 根据以下模板…

TCL嵌入式面试题及参考答案

USB2.0 和 USB3.0 的速度区别是什么? USB2.0 和 USB3.0 在速度上有显著的区别。USB2.0 理论上的最高传输速度为 480Mbps,也就是 60MB/s 左右。而 USB3.0 的理论传输速度则可达到 5Gbps,即约 625MB/s ,这比 USB2.0 快了很多倍。 在实际应用中,USB2.0 通常用于一些对速度要求…

微信小程序中使用iconfont的详细教程

我们知道微信小程序对包体积有很严格的要求&#xff0c;最大不超过2M&#xff0c;而图片资源对包体检有至关重要的影响&#xff0c;所以使用自定义的图标字体来代替大量图标图片也是提高小程序性能的重要手段&#xff0c;总的来说在微信小程序中使用 IconFont&#xff08;图标字…

C++数据结构与算法

C数据结构与算法 1.顺序表代码模版 C顺序表模版 #include <iostream> using namespace std; // 可以根据需要灵活变更类型 #define EleType intstruct SeqList {EleType* elements;int size;int capacity; };// Init a SeqList void InitList(SeqList* list, int capa…

【Rust Iterator 之 fold,map,filter,for_each】

Rust Iterator 之 fold,map,filter,for_each 前言mapfor_each通过源码看for_each foldfilter总结 前言 在Iterator 一文中&#xff0c;我们提到过Iterator时惰性的&#xff0c;也就是当我们将容器转换成迭代器时不会产生任何的迭代行为&#xff0c;所以在使用时开发者还需要将…

vscode连接远程开发机报错

远程开发机更新&#xff0c;vscode连接失败 报错信息 "install" terminal command done Install terminal quit with output: Host key verification failed. Received install output: Host key verification failed. Failed to parse remote port from server ou…

多线程下使用数据库 - 20241124

问题 并发性较低&#xff0c;每秒千次但是较高一致性&#xff0c;比如利用数据库中的数据进行判断是否执行某个操作 存在的问题是&#xff0c;如何只锁定判断相关的数据&#xff0c;而不影响数据库操作无关数据。脏读/不可重复读/幻读 解决方案 利用数据InnoDB引擎的LBCC和…

【AIGC】大模型面试高频考点-RAG篇

【AIGC】大模型面试高频考点-RAG篇 &#xff08;1&#xff09;RAG的基本原理&#xff08;2&#xff09;RAG有哪些评估方法&#xff1f;&#xff08;3&#xff09;RAG有哪些评估框架&#xff1f;&#xff08;4&#xff09;RAG各模块有哪些优化策略&#xff1f; &#xff08;1&am…

标准操作规程(SOP)制定方法+模板指南

在企业的成功之路上&#xff0c;拥有制定、传播以及管理流程文档与详细步骤指南的能力至关重要。众多组织都将标准操作规程&#xff08;SOP&#xff09;作为指导其工作流程操作的核心文档形式。 但SOP的作用远不止于操作指南&#xff1b;它们更像是高性能车辆中的精密GPS系统。…