【QT学习】9.绘图,三种贴图,贴图的转换

news2024/12/24 3:28:39

一。绘图的解释

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

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

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

相关文章

使用VPN后,浏览器访问不了国内地址解决办法

winR输入regedit 打开注册表 找到路径 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings删除两个proxy代理

【Android】 四大组件详解之广播接收器、内容提供器

目录 前言广播机制简介系统广播动态注册实现监听网络变化静态注册实现开机自启动 自定义广播发送标准广播发送有序广播 本地广播 内容提供器简介运行时权限访问其他程序中的数据ContentResolver的基本用法读取系统联系人 创建自己的内容提供器创建内容提供器的步骤 跨程序数据共…

JavaSE:抽象

一&#xff0c;抽象是什么&#xff0c;抽象和面向对象有什么关系 抽象&#xff0c;个人理解&#xff0c;就是抽象的意思 我们都知道面向对象的四大特征&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;抽象 为什么抽象是面向对象的特征之一&#xff0c;抽象和面…

Aigtek功率放大器电路的主要作用是什么

功率放大器是电子电路中的一个重要组成部分&#xff0c;它的主要作用是将输入信号的能量放大到更大的幅度&#xff0c;以便驱动负载或传输信号。功率放大器广泛应用于各种领域&#xff0c;如音频放大器、射频放大器、通信设备、无线电设备等。下面我们将详细介绍功率放大器电路…

【NOI】C++算法设计入门之深度优先搜索

文章目录 前言一、深度优先搜索1.引入2.概念3.迷宫问题中的DFS算法步骤4.特点5.时间、空间复杂度5.1 时间复杂度 (Time Complexity)5.2 空间复杂度 (Space Complexity)5.3 小结 二、例题讲解1.问题&#xff1a;1586 - 扫地机器人问题&#xff1a;1430 - 迷宫出口 三、总结四、感…

Rust 使用结构体组织相关联的数据

目录 结构体的定义和实例化 使用字段初始化简写语法使用结构体更新语法从其他实例创建实例使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体结构体示例程序 通过派生 trait 增加实用功能方法语法 定义方法带有更多参数的方法关联函数多个 impl 块本文有…

日志

日志服务管理 在现实生活中&#xff0c;记录日志也非常重要&#xff0c;比如银行的转账记录&#xff0c;飞机上的黑盒子&#xff0c;那么将系统和应用发生的事件记录至日志中&#xff0c;以助于排错和分析使用日志记录的内容包括&#xff1a; 历史事件&#xff1a;时间&#…

甘特图:如何制定一个有效的产品运营规划?

做好一个产品的运营规划是一个复杂且系统的过程&#xff0c;涉及多个方面和阶段。以下是一些关键步骤和考虑因素&#xff0c;帮助你制定一个有效的产品运营规划&#xff1a; 1、明确产品定位和目标用户&#xff1a; 确定产品的核心功能、特点和优势&#xff0c;明确产品在市…

向量的点积和叉积的几何意义

1. 点积 点积(dot product)&#xff0c;又称标量积&#xff08;scalar product&#xff09;。结果等于。 可用于 判断的是否垂直求投影长度求向量是抑制作用还是促进作用计算两个向量的夹角 2. 叉积 叉积(cross product)&#xff0c;又称为向量积(vector product)。模长等…

【C++类和对象】日期类的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

【深度学习实战(21)】使用thop.profile计算模型的FLOPs和Params

一、 含义 FLOPs&#xff08;计算量&#xff09;&#xff1a;注意s小写&#xff0c;是floating point operations的缩写&#xff08;这里的小s则表示复数&#xff09;&#xff0c;表示浮点运算数&#xff0c;理解为计算量。可以用来衡量算法/模型的复杂度。 Params&#xff08…

Dubbo应用可观测性升级指南与踩坑记录

应用从dubbo-3.1.*升级到dubbo-*:3.2.*最新稳定版本&#xff0c;提升应用的可观测性和度量数据准确性。 1. dubbo版本发布说明(可不关注) dubbo版本发布 https://github.com/apache/dubbo/releases 【升级兼容性】3.1 升级到 3.2 2. 应用修改点 应用一般只需要升级dubbo-s…

第53篇:算法的硬件实现<四>

Q&#xff1a;本期我们在DE2-115开发板上实现二进制搜索算法电路&#xff0c;查找数据A在数组中的位置。 A&#xff1a;使用SW[9]设定开始查找信号&#xff0c;数据A由SW[7:0]设定&#xff0c;KEY[0]设定为复位信号&#xff0c;板载50MHz时钟作为电路的时钟输入&#xff0c;确…

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…

【行为型模型】迭代器模式

一、迭代器模式概述 迭代器模式定义&#xff1a;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露其内部的表示。把游走的任务放在送代器上&#xff0c;而不是聚合上。这样简化了聚含的接口和实现,也让责任各得其所。(对象行为型) 迭代器模式的优缺点&…

第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队

关联比赛: 第二届阿里巴巴大数据智能云上编程大赛-智联招聘人岗智能匹配 查看更多内容&#xff0c;欢迎访问天池技术圈官方地址&#xff1a;第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队_天池技术圈-阿里云天池

[Windows] Bypass分流抢票 v1.16.25 五一黄金周自动抢票软件(2024.02.08更新)

五一黄金周要来了&#xff0c;火车票难买到&#xff0c;即便官网候选订票也要看运气&#xff0c;推荐使用这个靠谱的自动抢票软件&#xff0c; 该工具是目前市面上最好用口碑最好的电脑抢票软件&#xff0c;从13年到现在&#xff0c;作者依旧在更新&#xff0c;可以自动识别123…

Linux之 USB驱动框架-USB总线核心和主控驱动(4)

一、USB设备描述符 一个USB设备描述符中可以有多个配置描述符&#xff0c;即USB设备可以有多种配置&#xff1b;一个配置描述符中可以有多个接口描述符&#xff0c;即USB设备可以支持多种功能&#xff08;接口&#xff09;&#xff1b;一个接口描述符中可以有多个端点描述符。 …

Bentley二次开发教程16-元素管理-巩固练习

该练习中的方法涉及到前两期的方法&#xff0c;主要步骤为&#xff1a; 使用拉伸实体功能创建梁与圆柱并进行变换对梁截面进行标注并进行变换对梁与圆柱执行布尔运算对实体进行材质附加 public static void CmdPracticeWork(string unparsed) {DgnFile dgnFile Session.Inst…

小程序AI智能名片S2B2C商城系统:实现分销模式的四大要件深度解析

在当前的电商领域&#xff0c;小程序AI智能名片S2B2C商城系统正以其独特的分销模式&#xff0c;引领着行业创新的风潮。这种模式的成功&#xff0c;离不开四大核心要件&#xff1a;商品、机制、平台和运营。接下来&#xff0c;我们将对这四大要件进行深度解析。 首先&#xff0…