【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡)

news2024/10/6 10:31:53

一。绘图的解释

        Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。

        QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDevice、QWidget 和QPaintDevice 显示图形(线、形状、渐变等)、文本和图像。
        QPaintDevice 不直接绘制物理显示画面,而利用逻辑界面的中间媒介。例如,绘制矩形图形时,为了将对象绘制到 QWidget、QGLPixelBuffer、QImage、QPixmap、QPicture 等多种界面中间,必须使用 QPaintDevice。
        QPaintEngine 提供了一些接口,可用于 QPainter 在不同的设备上进行绘制。       

        绘图系统由 QPainter 完成具体的绘制操作,QPainter 类提供了大量高度优化的函数来完成 GUI 编程所需要的大部分绘制工作。它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,例如:点、线、矩形、弧形、饼状图、多边形、贝塞尔弧线等。此外,QPainter 也支持一些高级特性,例如反走样(针对文字和图形边缘)、像素混合、渐变填充和矢量路径等,QPainter 也支持线性变换,例如平移、旋转、缩放。

        QPainter 可以在继承自 QPaintDevice 类的任何对象上进行绘制操作。QPainter 也可以与QPrinter 一起使用来打印文件和创建 PDF 文档。这意味着通常可以用相同的代码在屏幕上显示数据,也可以生成打印形式的报告。

        QPainter 一般在部件的绘图事件 paintEvent() 中进行绘制,首先创建 QPainter 对象,然后进行图形的绘制,最后记得销毁 QPainter 对象。当窗口程序需要升级或者重新绘制时,调用此成员函数。使用 repaint()和 update() 后,调用函数 paintEvent()。

补充:绘图可看成画板,画布,画家,画笔,画刷组成。


————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/liang19890820/article/details/51154216

二。绘图具体功能演示

1.绘图事件paintEvent(QPaintEvent *event)

1.添加头文件

#include <QPainter>
#include <QPaintEvent>

2.绘图事件函数

void Widget::paintEvent(QPaintEvent *event){
    static int n=0;
    qDebug()<<n++<<endl;
}

结果:

        1.拖动窗口:不触发事件

        2.放大缩小窗口:触发事件

        3.隐藏显示窗口:触发事件

用此事件刷新页面。

2.使用QPainter绘图(使用画笔Qpen)

1.绘图步骤

//此函数响应后,用来刷新页面
void Widget::paintEvent(QPaintEvent *event){
    //画家
    QPainter p;//制作画家对象
    p.begin(this);//画家在画板上画画(指定画在什么上)
    //画笔
    QPen pen;
    pen.setColor(Qt::red);//红色
    pen.setWidth(5);//宽度
    pen.setStyle(Qt::SolidLine);//实线
    //画笔交给画家
    p.setPen(pen);
    //画家画画
    p.drawRect(0,0,100,100);//画长方形
    //----------------------------------------
    //重新设置画笔
    pen.setColor(Qt::green);//设置画笔
    pen.setWidth(3);
    pen.setStyle(Qt::DotLine);
    p.setPen(pen);//画笔交给画家
    p.drawEllipse(150,150,100,100);//画椭圆
    //画完了
    p.end();
}

2.使用QPainter创建画家,给他材料去画画

2.使用QPainter绘图(使用画刷QBrush)

1.QPainter调用QBrush画画

//此函数响应后,用来刷新页面
void Widget::paintEvent(QPaintEvent *event){
    //画家
    QPainter p;//制作画家对象
    p.begin(this);//画家在画板上画画(指定画在什么上)
    //制作画刷
    QBrush brush;
    brush.setColor(QColor(0,255,255));
    brush.setStyle(Qt::Dense1Pattern);
    p.setBrush(brush);
    p.drawRect(200,100,100,100);
    //画完了
    p.end();
}

三。贴图

贴图:

  1. QBitmap 和 QPixmap

                QBitmap :黑白色

                QPixmap :彩色

2. QPixmap QImage Qpicture

  1. QPixmap 适应不同平台 不能改 保存成各种各样的格式的图片文件
  2. QImage  不适应平台   可以修改内容   保存成各种各样的格式的图片文件
  3. QPicture  保存成二进制文件

1.彩图,黑白图,动图

1.创建时间事件timerEvent与绘图事件paintEvent

代码:
 

protected:
    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent* e);
private:
    Ui::Widget *ui;
    int x,y;
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    x=0;y=400;
    startTimer(100);
}
void Widget::timerEvent(QTimerEvent* e){
    x += 3;
    /*this->*/update();//当前控件产生重绘事件   paintEvent
}
//此函数响应后,用来刷新页面
void Widget::paintEvent(QPaintEvent *event){
    QPainter p(this);
    p.drawPixmap(0,0,100,100,QPixmap("../0.png"));
    //p.drawPixmap(0,0,100,100,QBitmap("../0.png"));
    //p.drawPixmap(x,y,100,100,QPixmap("../0.png"));
}

2.QImage可以修改图片

1.使用QPainter画家画Qimage图,并且在上面画一些点

{
    ui->setupUi(this);
    QImage image(400,400,QImage::Format_ARGB32);
    QPainter p(&image);//QPainter p;  p.begin(&image);   p.end();

    p.drawImage(0,0,QImage("../0.png"));
    //QImage可以修改图
    QPen pen;
    pen.setColor(Qt::blue);
    p.setPen(pen);
    for(int i=0;i<20;i++){
        for(int j=0;j<20;j++){
            p.drawPoint(j,i);
        }
    }
    //保存
    image.save("../iamge0.png");
}

2.

3.QPicture保存图片为二进制文件

    QPicture picture;
    QPainter p;
    p.begin(&picture);
//等价
    /*
        QPainter p(&picture);
    */

1.代码

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPicture picture;
    picture.save("../picture0.png");
}
void Widget::paintEvent(QPaintEvent *event){
    qDebug()<<"活着"<<endl;
    QPainter p(this);
    //贴 picture类型图片
    QPicture pic;

    pic.load("../picture0.png");
    p.drawPixmap(100,100,100,100,QPixmap("../0.png"));
    p.drawPicture(0,0,pic);
}

保存成功

错误:picture图片没有显示

四。贴图的转换

    //pixmap 类型 和 image类型切换
     QPixmap pixmap;
     pixmap.load("../pixmapPaopao.png"); 
     QImage imgTemp = pixmap.toImage();
     p.drawImage(0,0,imgTemp);
 
     QImage  image;
     image.load("../iamgePaopao.png");
     p.drawPixmap(400,400,QPixmap::fromImage(image));

五。不规则贴图

1.结果:

2.步骤

创建事件,鼠标按下事件,鼠标移动事件,绘图事件。创建一个点属性。

protected:
    void paintEvent(QPaintEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
private:
    Ui::Widget *ui;
    QPoint pos;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());//去掉边框
    //设置窗口背景透明
    setAttribute(Qt::WA_TranslucentBackground);
}
void Widget::mousePressEvent(QMouseEvent *event){
    if(event->button() == Qt::LeftButton){
        //     鼠标坐标           -        窗口左上角的点的坐标
        pos = event->globalPos() - this->frameGeometry().topLeft();
    }else if(event->button() == Qt::RightButton){
        //右键按下,关闭
        close();
    }
}
void Widget::mouseMoveEvent(QMouseEvent *event){
    if(event->buttons() & Qt::LeftButton){
        move(event->globalPos() - pos);
    }
}

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

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

相关文章

Windows10如何关闭Edge浏览器的Copilot

在Windows10更新后&#xff0c;打开Edge浏览器&#xff0c;无论复制什么内容&#xff0c;都会弹出Copilot人工智能插件&#xff0c;非常令人反感&#xff0c;网上搜索的关闭方法都非常麻烦&#xff0c;比如&#xff1a;组策略和注册表。自己摸索得出最简便有效的关闭方法。 1、…

自然语言处理: 第二十八章大模型基底之llama3

项目地址: meta-llama/llama3: The official Meta Llama 3 GitHub site 前言 LLaMa系列一直是人们关注的焦点&#xff0c;Meta在4月18日发布了其最新大型语言模型 LLaMA 3。该模型将被集成到其虚拟助手Meta AI中。Meta自称8B和70B的LLaMA 3是当今 8B 和 70B 参数规模的最佳模…

【深度学习】YOLOv5,烟雾和火焰,目标检测,防火检测,森林火焰检测

文章目录 数据收集和数据标注查看标注好的数据的脚本下载yolov5创建 dataset.yaml训练参数开始训练yolov5n训练训练后的权重下载gradio部署 数据收集和数据标注 搜集数据集2w张。 pip install labelme labelme 然后标注矩形框和类别。 下载数据请看这里&#xff1a; https:…

Go 堆内存分配源码解读

简要介绍 在Go的内存分配中存在几个关键结构&#xff0c;分别是page、mspan、mcache、mcentral、mheap&#xff0c;其中mheap中又包括heapArena&#xff0c;具体这些结构在内存分配中担任什么角色呢&#xff1f; 如下图&#xff0c;可以先看一下整体的结构&#xff1a; mcach…

Jackson 2.x 系列【30】Spring Boot 集成之数据脱敏

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 概述2. 实现思路3. 案例演示3.1 脱敏规则3.2 自…

SpringBoot学习之Kafka发送消费消息入门实例(三十五)

使用Kafka之前需要先启动fKafka,如何下载安装启动kafka请先参考本篇文章的前两篇: 《SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)》 《SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)》 一、POM依赖 1、加入kafka依赖 2、我的整个POM代码…

docker容器技术篇:容器集群管理实战mesos+zookeeper+marathon(一)

容器集群管理实战mesoszookeepermarathon&#xff08;一&#xff09; mesos概述 1.1 Mesos是什么 Apache Mesos 是一个基于多资源调度的集群管理软件&#xff0c;提供了有效的、跨分布式应用或框架的资源隔离和共享&#xff0c;可以运行 Hadoop、Spark以及docker等。 1.2 为…

银河麒麟V10 SP1服务器客户端定时数据同步

银河麒麟V10 SP1服务器客户端定时数据同步 0.概述 当前只测试了将数据从客户端往服务端推送&#xff0c;两个客户端分别推送不同的数据 1.环境 三台电脑均为银河麒麟V10SP1桌面操作系统 服务器IP&#xff1a;192.168.1.51 用户名&#xff1a;wlh 客户端IP&#xff1a;192…

C语言Linux vim shell命令

无论是在插入模式或者是其他模式下对于文件的修改都是对于内存缓冲区进行修改&#xff0c;只有当点击w进行保存以后才会将数据写入到一个新的文件中的&#xff0c;将源文件删除&#xff0c;并且新文件改为文件的名字 1. actionmotion dG删到文件尾 ggdG先到开头再删除到末尾…

微服务项目实战-黑马头条(八):App端-文章ES搜索、MongoDB搜索记录和关键词联想

文章目录 一、今日内容介绍1.1 App端搜索-效果图1.2 今日内容 二、搭建ElasticSearch环境2.1 拉取镜像2.2 创建容器2.3 配置中文分词器 ik2.4 使用postman测试 三、app端文章搜索3.1 需求分析3.2 思路分析3.3 创建索引和映射3.4 数据初始化到索引库3.4.1 导入es-init到heima-le…

光纤网络电力控制系统设计方案:623-6U CPCI的光纤网络电力控制系统

6U CPCI的光纤网络电力控制系统 一、设备概述 柔性直流输电系统中用于控制与测量的FS系统&#xff0c;适用于风电和太阳能发电的并网快速数值计算和闭环控制&#xff0c;以及与直流输电系统的换流器有关的特殊控制功能&#xff0c;包括门控单元的信号处理。该控制板的最大…

Tensorflow2.0笔记 - BatchNormalization

本笔记记录BN层相关的代码。关于BatchNormalization&#xff0c;可以自行百度&#xff0c;或参考这里&#xff1a; 一文读懂Batch Normalization - 知乎神经网络基础系列&#xff1a; 《深度学习中常见激活函数的原理和特点》《过拟合: dropout原理和在模型中的多种应用》深度…

ZYNQ--PL读写PS端DDR数据

PL 和PS的高效交互是zynq 7000 soc开发的重中之重&#xff0c;我们常常需要将PL端的大量数 据实时送到PS端处理&#xff0c;或者将PS端处理结果实时送到PL端处理&#xff0c;常规我们会想到使用DMA 的方式来进行&#xff0c;但是各种协议非常麻烦&#xff0c;灵活性也比较差&am…

【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

k8s calico vxlan式详解

之前的文章讲了k8s ipip模式的使用以及流量路径&#xff0c;本篇文章主要是来讲解一下vxlan 模式下pod 流量是如何通信的。 一、ipip模式转vxlan 修改calico backend参数 将calico_backend参数由bird设置为vxlan,因为vxlan部署不使用bgp 修改calico controllers的configmap…

Linux安装redis(单机和集群)

一、单机安装 1.源码安装&#xff08;方式一&#xff09; 1.1 下载并上传tar包 将redis-6.2.6.tar.gz 上传到/home/data/install_pkg/redis下 1.2 解压缩 cd /home/data/install_pkg/redis //切到指定目录 tar -xvf redis-6.2.6.tar.gz //解压缩 1.3 编译安…

Esp8266 - USB开关分享(开源)

文章目录 简介推广自己gitee项目地址:嘉立创项目地址&#xff1a;联系我们 功能演示视频原理图嘉立创PCB开源地址原理图PCB预览 固件烧录代码编译烧录1. 软件和驱动安装2. 代码编译1. 安装所需要的依赖库文件2. 下载源代码3. 烧录代码 使用说明1. 设备配网2. 打开设备操作页面3…

vue3去掉el-table底部白色边框

加入下面这一行代码就行了&#xff0c;我用的是less :deep(.el-table__inner-wrapper:before) {background: none;}效果图

腾讯云向量数据库-RAG介绍2

1.chunk拆分对最终效果的影响 2.改进知识的拆分方案 3.AI套件 4.相似性检索的关键&#xff1a;embedding技术 嵌入技术是相似性检索的关键&#xff0c;它能够将数据转换为向量表示&#xff0c;并通过比较向量之间的相似性来实现相似性检索&#xff1b;embedding&#xff1a;将…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行&#xff0c;但很多开发人员仍然不清楚它是如何实际运作的&#xff0c;这是非常正常的。 平台工程是与 DevOps 并行吗&#xff1f;还是可以相互替代&#xff1f;或者 DevOps 和平台工程是两个完全不同的概念&#xff1f; 一种比较容易将两者区分开来的方…