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

Qt---绘图和绘图设备

一、QPainter绘图

绘图事件        void paintEvent()
声明一个画家对象,OPainter painter(this)        this指定绘图设备
画线、画圆、画矩形、画文字
设置画笔QPen        设置画笔宽度、风格

设置画刷QBrush        设置画刷风格

代码示例:

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}void Widget::paintEvent(QPaintEvent *){//实例化画家对象  this指定的是绘图的设备QPainter painter(this);//设置画笔QPen pen(QColor(255,0,0));//设置画笔风格pen.setStyle(Qt::DotLine);//设置画笔宽度pen.setWidth(3);//让画家使用这个笔painter.setPen(pen);//设置画刷-->填充颜色QBrush brush(Qt::cyan);//设置画刷风格brush.setStyle(Qt::Dense7Pattern);//让画家使用画刷painter.setBrush(brush);//画线painter.drawLine(QPoint(0,0),QPoint(100,100));//画圆   椭圆painter.drawEllipse(QPoint(100,100),50,50);//画矩形painter.drawRect(QRect(20,20,50,50));//画文字painter.drawText(QRect(10,200,150,50),"好好学习,天天向上");}Widget::~Widget()
{delete ui;
}

输出如下所示:

 

二、QPainter高级设置

抗锯齿        效率低
painter.setRenderHint(QPainter::Antialiasing);

对画家进行移动
        painter.translate(100,0);

        保存状态save
        还原状态restore

代码示例: 

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}void Widget::paintEvent(QPaintEvent *){//高级设置///QPainter painter(this);
//     painter.drawEllipse(QPoint(100,50),50,50);
//     //设置抗锯齿能力  效率低
//     painter.setRenderHint(QPainter::Antialiasing);
//     painter.drawEllipse(QPoint(200,50),50,50);//画矩形painter.drawRect(QRect(20,20,50,50));//移动画家painter.translate(100,0);//保存画家状态painter.save();painter.drawRect(QRect(20,20,50,50));painter.translate(100,0);//还原画家保存状态painter.restore();painter.drawRect(QRect(20,20,50,50));}Widget::~Widget()
{delete ui;
}

三、手动调用绘图事件

如果想手动调用绘图事件利用update()
利用画家画图片painter.drawPixmap( x, y,QPixmap(路飞))

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//绘图事件void paintEvent(QPaintEvent *);int posX = 0;private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp 

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//点击移动按钮,移动图片connect(ui->pushButton,&QPushButton::clicked,[=](){posX += 20;//如果要手动调用绘图事件 用update更新update();});
}void Widget::paintEvent(QPaintEvent *){///利用画家 画资源图片//QPainter painter(this);//如果超出屏幕从0开始if(posX > this->width()){posX = 0;}painter.drawPixmap(posX,0,QPixmap(":/image/Luffy.png"));}Widget::~Widget()
{delete ui;
}

输出如下所示:(当超出屏幕时从0开始)

利用定时器让其自动从左到右移动: 

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类
#include<QTimer>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//点击移动按钮,移动图片connect(ui->pushButton,&QPushButton::clicked,[=](){posX += 20;//如果要手动调用绘图事件 用update更新update();});//实现自动让图片向右移动QTimer *timer = new QTimer(this);timer->start(10);connect(timer,&QTimer::timeout,[=](){posX++;update();});
}void Widget::paintEvent(QPaintEvent *){///利用画家 画资源图片//QPainter painter(this);//如果超出屏幕从0开始if(posX > this->width()){posX = 0;}painter.drawPixmap(posX,0,QPixmap(":/image/Luffy.png"));}Widget::~Widget()
{delete ui;
}

四、绘图设备

1. QPixmap Qlmage QBitmap(黑白色) QPicture Qwidget

2. QPixmap对不同平台做了显示的优化
        QPixmap pix( 300,300)
        pix.fill(填充颜色)
        利用画家往pix 上画画        QPainter painter( & pix)

        保存pix.save(“路径")

3. Qimage可以对像素进行访问
        使用和QPixmap差不多 Qlmage img(300,300,Qlmage::Format_RGB32);

        其他流程和QPixmap一样
        可以对像素进行修改img.setPixel(i,j,value);

代码示例:

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//    //Pixmap绘图设备 专门为平台做了显示的优化
//    QPixmap pix(300,300);//    //填充颜色
//    pix.fill(Qt::white);//    //声明画家
//    QPainter painter(&pix);
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);//    //保存
//    pix.save("D:\\QT\\pix.png");//QImage绘图设备    可以对像素进行访问QImage img(300,300,QImage::Format_RGB32);img.fill(Qt::white);QPainter painter(&img);painter.setPen(QPen(Qt::blue));painter.drawEllipse(QPoint(150,150),100,100);//保存img.save("D:\\QT\\img.png");
}Widget::~Widget()
{delete ui;
}

QPixmap和Qimage输出如下所示为:

                

Qimage修改像素点:

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}//绘图事件
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//利用QImage 对像素进行修改QImage img;img.load(":/image/Luffy.png");//修改像素点for(int i = 50; i < 100; i++){for(int j = 50; j<100;j++){QRgb value = qRgb(255,0,0);img.setPixel(i,j,value);}}painter.drawImage(0,0,img);
}Widget::~Widget()
{delete ui;
}

输出对比如下所示: 

     

4. QPicture记录和重现绘图指令

        QPicture pic
        painter.begin(&pic);
        保存:pic.save(任意后缀名)

        重现:利用画家可以重现        painter.drawPicture(0,0,pic);

代码示例: 

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>
#include<QPicture>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//QPicture绘图设备  可以记录和重现绘图指令QPicture pic;QPainter painter;painter.begin(&pic);//开始往pic上画painter.setPen(QPen(Qt::cyan));painter.drawEllipse(QPoint(150 ,150),100,100);painter.end();//结束画画//保存到磁盘pic.save("D:\\QT\\pic.zt");
}//绘图事件
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//重现绘图指令QPicture pic;pic.load("D:\\QT\\pic.zt");painter.drawPicture(0,0,pic);
}Widget::~Widget()
{delete ui;
}

输出如下所示: 

相关文章:

Qt---绘图和绘图设备

一、QPainter绘图 绘图事件 void paintEvent() 声明一个画家对象&#xff0c;OPainter painter(this) this指定绘图设备 画线、画圆、画矩形、画文字 设置画笔QPen 设置画笔宽度、风格 设置画刷QBrush 设置画刷风格 代码示例&#xff1a; #includ…...

【2024】前端,该卷什么呢?

✅顺便推个机会&#xff0c;技术大厂&#xff0c;部门捞人&#xff0c;前后端可投。 2024ChatGPT 的炸裂式发展&#xff0c;很多大佬都亲自入场整活儿&#xff0c;你不得不说&#xff0c;人工智能时代的未来已来&#xff0c;大势所趋&#xff0c;不可阻挡。随着生成式AI的迅猛发…...

C++干货--引用

前言&#xff1a; C的引用&#xff0c;是学习C的重点之一&#xff0c;它与指针的作用有重叠的部分&#xff0c;但是它绝不是完全取代指针(后面我们也会简单的分析)。 引用的概念&#xff1a; 引用 不是新定义一个变量 &#xff0c;而 是给已存在变量取了一个别名 &#xf…...

部署 Sentinel 控制台:实现流量管理和监控

序言 Sentinel 是阿里巴巴开源的一款流量防护与监控平台&#xff0c;它可以帮助开发者有效地管理微服务的流量&#xff0c;实现流量控制、熔断降级、系统负载保护等功能。本文将介绍如何在项目中部署和配置 Sentinel 控制台&#xff0c;实现微服务的流量防护和监控。 一、Sen…...

10、Go Gin 连接Redis以及CookieSession

一、Redis 在Go语言中&#xff0c;使用Gin框架结合Redis数据库可以构建高性能的Web应用程序。Gin是一个轻量级的HTTP框架&#xff0c;提供了快速构建RESTful API的能力&#xff1b;而Redis则是一个高性能的键值存储系统&#xff0c;常用于缓存、消息队列、计数器等多种场景 1、…...

Electron-Vue 脚手架避坑实录,兼容Win11,升级electron22,清理控制台错误

去年的还是有用的&#xff0c;大家继续看&#xff0c;今年再补充一些Electron-Vue 异常处理方案 M1 和 Window10_electron异常处理-CSDN博客 代码gitee.com地址 electron-demo: electron 22 初始代码开发和讲解 升级electron为22版本&#xff08;这个版本承上启下&#xff0c…...

国外新闻媒体推广:多元化媒体分发投放-大舍传媒

前言 &#xff1a;随着全球化的进程&#xff0c;国外新闻市场呈现出快速发展的趋势。在这个趋势下&#xff0c;国外新闻媒体推广成为了各行业企业宣传业务的重要一环。本文将重点介绍大舍传媒的多元化媒体分发投放服务&#xff0c;以及对国外新闻媒体推广的意义。 1. 多元化媒…...

【Windows】回忆Win98

回忆Win98&#xff0c;又看到了这个Excel界面&#xff0c;上次还是十多年前的计算机课上 1、安装环境 Win11家庭版,23H2,VMware Workstation Pro 16 , 2、安装步骤及参考 虚拟机里的硬盘设置成SATA&#xff08;否则各种错误&#xff09;&#xff0c;安装MSDOS7.1&#xff…...

探索QChart:Qt中的数据可视化艺术

目录标题 1. QChart概述2. 创建QChart对象3. 添加数据系列&#xff08;Series&#xff09;4. 定制图表外观5. 交互与动画6. 图表布局与管理7. 实例代码与解析8. 总结 在数字化的世界里&#xff0c;数据是新的石油。然而&#xff0c;原始数据本身往往难以理解&#xff0c;数据可…...

【Linux】线程机制解析:理解、优势与Linux系统应用

文章目录 前言&#xff1a;1. 线程概念1.1. 什么是线程1.2. 线程得优点&#xff1a;1.3. 线程的缺点线程异常线程的用途 2. 线程的理解&#xff08;Linux 系统为例&#xff09;2.1. 为什么要设计Linux“线程"&#xff1f;2.2. 什么是进程&#xff1f;2.3. 关于调度的问题2…...

java中简单工厂模式,工厂方法模式和抽象工厂模式的区别和联系?

在Java中&#xff0c;简单工厂模式、工厂方法模式和抽象工厂模式都是创建型设计模式&#xff0c;用于解耦对象的创建过程&#xff0c;提高系统的灵活性和可扩展性。它们之间既有相似之处也有明显的区别&#xff1a; 简单工厂模式&#xff08;Simple Factory Pattern&#xff0…...

SERVER_DOWN 表示该服务器已经宕机或无法访问

[{"type":"MASTER","host":"/nodes/master/ds-master-0.ds-master-headless:5678","event":"SERVER_DOWN","warningLevel":"SERIOUS"}] 该JSON数据描述了一个事件通知&#xff0c;具体地&am…...

深度论证-高速走线控制100欧姆阻抗一定是最好的选择吗?

高速先生成员--黄刚 对于高速差分信号到底需要控制多少欧姆的阻抗&#xff0c;高速先生相信大部分工程师首先都会看下例如信号的协议文档或者芯片的文档&#xff0c;看看里面有没有推荐的控制阻抗值。例如像PCIE信号&#xff0c;在4.0之后的阻抗会明确要求按照85欧姆来控制&…...

【文末福利送资料】深度探索GPT模型,竟然10个字都不会说?

目录 导读 自回归模型 那么什么时候停下呢&#xff1f; 该停下来&#xff0c;但是概率不让啊 GPT欠缺的两种能力 目录 导读 自回归模型 那么什么时候停下呢&#xff1f; 该停下来&#xff0c;但是概率不让啊 GPT欠缺的两种能力 缺少规划 反省和修订 所有的人工智能…...

一些近来对内网攻防的思考

我知道我最近托更托了很久了&#xff0c;其实也不是小编懒啊 这小编也是一直在写&#xff0c;但是遇到的问题比较多&#xff08;我太菜了&#xff09;&#xff0c;所以一直拖着。 但是总不能不更吧 那就讲一下进来的一些内网攻防的思考吧 1.CrossC2上线Linux到CS(成功) …...

数据结构--顺序表和链表的区别

顺序表和链表之间各有优劣&#xff0c;我们不能以偏概全&#xff0c;所以我们在使用时要关注任务的注重点&#xff0c;以此来确定我们要使用两者中的哪一个。 不同点&#xff1a; 存储空间上&#xff1a; 顺序表在物理结构上是一定连续的&#xff0c;而链表(这里以带头双向循环…...

【技术分享】 OPC UA安全策略证书简述

那什么是OPC UA证书&#xff1f;用途是什么&#xff1f; 简单来说它是身份验证和权限识别。 OPC UA使用X.509证书标准&#xff0c;该标准定义了标准的公钥格式。建立UA会话的时候&#xff0c;客户端和服务器应用程序会协商一个安全通信通道。数字证书&#xff08;X.509&#x…...

【Neo4jJDK开箱即用的安装全流程】

neo4j:命令行本地访问loclhost neo4j:命令行本地访问loclhost2 neo4j操作 Neo4j桌面版数据库导出导入 Neo4j安装与配置以及JDK安装与配置教程&#xff08;超详细&#xff09; Neo4j 安装、使用教程 Neo4j安装教程 Neo4J桌面版的配置和连接Pycharm jdk-neo对应版本 JDK ORACLE中…...

Linux 操作系统多路IO复用

1.多路IO复用 多路I/O复用是通过一种机制&#xff0c;可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够通知程序进行相应的读写操作。 这个机制能够通过select/poll/eroll等来使用。这些函数都可以同时监视多…...

读取shape文件中数据

读取shape文件中数据 pom文件中引入依赖 <dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>26.4</version></dependency>如果jar包下载不下来,在pom中添加下geotools的仓库 <…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...