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

2024-04-24 19:52

本文主要是介绍【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一。绘图的解释

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

这篇关于【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932690

相关文章

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c