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

news/2024/10/20 5:29:07/

一。绘图的解释

        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);}
}

 六。简单绘图工具制作

结果:

1.两个按钮

2.widget。h

3.widget。cpp

鼠标按下事件

鼠标移动事件

鼠标释放事件

绘图事件


http://www.ppmy.cn/news/1439160.html

相关文章

vue与Spring boot数据交互例子【简单版】

文章目录 什么是Vue&#xff1f;快速体验Vueaxios是什么&#xff1f;向Springboot后端发送数据接收Springboot后端数据小结 什么是Vue&#xff1f; 官网解释&#xff1a;Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上…

Oracle中取出clob类型

1、Mybatis返回值用map接受&#xff0c;对应的value类型就是个clob类型&#xff0c;可以确保不会丢失长度&#xff0c;自带的sql执行器转varchar2的话可能会长度丢失。 2、将map放入工具类(clob类型转String) package com.ly.cloud.common.utils;import java.sql.Clob; impor…

electron 中统一管理全局常量

在 Electron 应用中统一管理全局常量是一个好的实践&#xff0c;可以帮助你维护清晰的代码结构&#xff0c;并使得常量在整个主进程和渲染进程之间轻松共享。以下是几种在 Electron 中管理全局常量的方法&#xff1a; 1. 使用 JavaScript 模块 创建一个常量模块 你可以创建一…

Linux已安装virtualenv 但还是报 bash: virtualenv: command not found 错误原因及解决

场景 在 linux 上已经安装了python和 virtualenv &#xff0c;但是直接执行 virtualenv 相关的指令创建虚拟环境还是失败并且报错 bash: virtualenv: command not found 原因 虽然手动安装了virtualenv 没有自动配置 virtualenv 的软连接 解决方式 手动在安装目录下去执行…

面试的时间地点(南京坦道)工程化问题比较少,通用性问题表较多

1.前端的选型 2.前端的$nicktick&#xff08;&#xff09; 3.前端的媒体查询 4.前端的 VUE 高级用法 我的回答{ web端视图层的渲染原理 } 5.前端的数组&#xff0c;异步处理 我的回答{ 回了&#xff0c;最笨的方法。 es6的set&#xff08;&#xff09;&#xff1b; 参数是&…

Django 学习 笔记

Django 一、模型models 继承django.db.models.Model 1.模型字段 / 模型字段选项参考&#xff1a; 官网&#xff1a;https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/#common-model-field-options 2.模型Meta选项(定义模型类的属性)&#xff1a; csdn: https:/…

springcloud按版本发布微服务达到不停机更新的效果

本文基于以下环境完成 spring-boot 2.3.2.RELEASEspring-cloud Hoxton.SR9spring-cloud-alibaba 2.2.6.RELEASEspring-cloud-starter-gateway 2.2.6.RELEASEspring-cloud-starter-loadbalancer 2.2.6.RELEASEnacos 2.0.3 一、思路 实现思路&#xff1a; 前端项目在请求后端接…

Python项目开发实战:如何实现爬虫与二级域名枚举

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python项目开发实战_爬虫与二级域名枚举_编程案例解析实例详解课程教程.pdf 1、简介 一、引言 在当今信息爆炸的时代,如何有效地获取、处理和分析…