1  简介

参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=40

Qt绘图设备有三种:QPixmap、QBitmap、QImage、QPicture。

QPixmap:专门针对屏幕进行优化了,和平台相关,不能对图片进行修改。

QBitmap:QPixmap的一个子类,它的色深限定为1(表示颜色的二进制位数),提供单色图像,只有黑白两色的图像数据。

QImage:和平台无关,可以对图片进行修改,可在线程中绘图。

QPicture:保存绘图的状态为二进制文件。

2  测试

(1)QPixmap和QBitmap的比较

说明:使用两张背景色分别为透明和白色的图片,分别用QPixmap和QBitmap进行绘制,进行对比分析。

原始图片:第一张背景为透明,第二张背景为白色。

    

测试代码:

 1 void Widget::paintEvent(QPaintEvent *event)
2 {
3 QPainter p(this);
4
5 //QPixmap 图片背景透明
6 p.drawPixmap(0, 0, QPixmap(":/new/prefix1/image/butterfly.png"));
7 //QBitmap 图片背景透明
8 p.drawPixmap(200, 0, QBitmap(":/new/prefix1/image/butterfly.png"));
9
10 //QPixmap 图片背景白色
11 QPixmap pixmap;
12 pixmap.load(":/new/prefix1/image/butterfly1.png");
13 p.drawPixmap(0, 200, pixmap);
14 //QBitmap 图片背景白色
15 QBitmap bitmap;
16 bitmap.load(":/new/prefix1/image/butterfly1.png");
17 p.drawPixmap(200, 200, bitmap);
18 }

运行结果:

可以看出,使用QBitmap绘制,白色的背景在QBitmap中消失了,而透明色在QBitmap中转换成了黑色;其他颜色则是使用点的疏密程度来体现的。

(2)QPixmap绘制图片

说明:在400x300的窗口中将背景色设置为白色,并加载一个图片,然后保存。

测试代码:

 1 Widget::Widget(QWidget *parent) :
2 QWidget(parent),
3 ui(new Ui::Widget)
4 {
5 ui->setupUi(this);
6
7 //绘图设备: 400x300
8 QPixmap pixmap(400, 300);
9 QPainter p(&pixmap);
10 //填充背景
11 p.fillRect(0, 0, 400, 300, QBrush(Qt::white));
12 //pixmap.fill(Qt::white);
13 p.drawPixmap(0, 0, 80, 80, QPixmap("../image/face.png"));
14 //保存图片
15 pixmap.save("../pixmap.png");
16 }

运行测试:

(3) QImage绘制图片

说明:使用QImage绘制图片,并改变50x50的像素点的颜色,然后保存图片。

测试代码:

 1 Widget::Widget(QWidget *parent) :
2 QWidget(parent),
3 ui(new Ui::Widget)
4 {
5 ui->setupUi(this);
6
7 //创建一个绘图设备,背景是透明色
8 QImage image(400, 300, QImage::Format_ARGB32);
9 QPainter p;
10 p.begin(&image);
11 //绘图
12 p.drawImage(0, 0, QImage("../image/face.png"));
13 //对绘图设备前50个像素点进行操作
14 for (int i=0; i < 50; i++) {
15 for (int j=0; j < 50; j++) {
16 image.setPixel(QPoint(i, j), qRgb(0, 255, 0));
17 }
18 }
19 p.end();
20 image.save("../image.png");
21 }

运行结果:

(4)QPicture绘制图片

说明:使用QPicture绘制图片,并保存为二进制文件,然后加载进行显示。

绘制保存图片的代码:

 1 Widget::Widget(QWidget *parent) :
2 QWidget(parent),
3 ui(new Ui::Widget)
4 {
5 ui->setupUi(this);
6
7 QPicture picture;
8 QPainter painter;
9 painter.begin(&picture);
10 painter.drawPixmap(0, 0, 80, 80, QPixmap("../image/face.png"));
11 painter.drawLine(50, 50, 150, 50);
12 painter.end();
13 //保存的是二进制文件
14 picture.save("../picture.png");
15 }

加载,绘制事件:

1 void Widget::paintEvent(QPaintEvent *event)
2 {
3 QPicture pic;
4 //加载文件
5 pic.load("../picture.png");
6
7 QPainter p(this);
8 p.drawPicture(0, 0, pic);
9 }

运行测试:

(5)QPixmap与QImage之间的相互转换

说明:QPixmap和QImage之间可以使用函数相互转换。

测试代码:

 1 void Widget::paintEvent(QPaintEvent *event)
2 {
3 QPainter p(this);
4 QPixmap pixmap;
5 pixmap.load("../image/face.png");
6
7 //QPixmap --> QImage
8 QImage tempImge = pixmap.toImage();
9 p.drawImage(0, 0, tempImge);
10
11 QImage image;
12 image.load("../image/face.png");
13 //QImage --> QPixmap
14 QPixmap tmpPixmap = QPixmap::fromImage(image);
15 p.drawPixmap(200, 0, tmpPixmap);
16 }

运行结果:

Qt-绘图设备的更多相关文章

  1. 界面编程之QT绘图和绘图设备20180728

    /*******************************************************************************************/ 一.绘图 整 ...

  2. Qt绘图之QGraphicsScene QGraphicsView QGraphicsItem详解

    Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放.这个柜架也包 ...

  3. qt绘制设备

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import  * from Py ...

  4. Qt 绘图与动画系统

    Qt 提供了内置的绘图系统以及独立的QtOpenGL模块提供对OpenGL的支持.Qt提供了基于状态机的QPainter系统和面向对象的Graphics View系统. QPainter 基于状态机的 ...

  5. Qt——绘图

    1.涉及类 QPainter  QPaintEngine QPaintDevice 作为绘图的使用者,只需要关注 QPainter 和 QPaintDevice 2.QPainter 使用 QPain ...

  6. QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息

    Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...

  7. [Qt2D绘图]-05绘图设备-QPixmap&&QBitmap&&QImage&&QPicture

    这篇笔记记录的是QPainterDevice(绘图设备,可以理解为一个画板) 大纲:     绘图设备相关的类:QPixmap QBitmap QImage QPicture     QPixmap ...

  8. Qt 绘图(QBitmap,QPixmap,QImage,QPicture)

    QPainter绘图绘图设备(QPixmap,QImage,QBitmap,QPicture) 重写绘图事件,虚函数 如果窗口绘图,必须放在绘图事件里实现 绘图事件内部自动调用,窗口需要重绘的时候,状 ...

  9. QPainter. QpaintDevice 绘图设备

    QPaintDevice 绘图设备 1 QPixmap QImage Qbitmap(黑白色) QPicture QWidget 2 QPixmap 对不同平台做了显示优化  fill(填充颜色) Q ...

  10. Qt绘图

    Qt绘图的设置 QPainter::Antialiasing // 反锯齿 QPainter::TextAntialiasing // 文字反锯齿 QPainter::SmoothPixmapTran ...

随机推荐

  1. git fork 项目的更新

    fork:github网站的操作,将开源项目复制一份到自己的仓库中 那fork的项目在原仓库更新后,如何同步呢? 1.查看远程仓库 $ git remote -v origin https://cod ...

  2. next.js app目录 i18n国际化简单实现

    最近在用next写一个多语言的项目,找了好久没找到简单实现的教程,实践起来感觉都比较复杂,最后终于是在官方文档找到了,结合网上找到的代码demo,终于实现了,在这里简单总结一下. 此教程适用于比较简单 ...

  3. eclipse jar包 Source not found

    jar包 Source not found 错误内容: Source not found The source attachment does not contain the source for t ...

  4. 力扣12(java)-整数转罗马数字(中等)

    题目: 罗马数字包含以下七种字符:I, V, X, L, C, D, M 1 字符 数值 2 I 1 3 V 5 4 X 10 5 L 50 6 C 100 7 D 500 8 M 1000 例如, ...

  5. 万节点规模云服务的 SRE 能力建设

    简介: 随着越来越多企业以容器作为系统底座,那么阿里云的云服务又是如何进行SRE规划呢?下文将由资深SRE工程师拆解2 万节点规模云服务背后的 SRE 能力建设,立即点击观看! 作者:宋傲(凡星)   ...

  6. Morphling:云原生部署 AI , 如何把降本做到极致?

    ​简介: Morphling 本意是游戏 Dota 中的英雄"水人",他可以根据环境要求,通过灵活改变自身形态,优化战斗表现.我们希望通过 Morphling 项目,实现针对机器学 ...

  7. [FAQ] FinalCutPro 事件如何支持多个时间线

    左侧是建立的事件,右侧是默认的项目(也就是时间线上的剪辑项目). 如果需要这个事件里再弄一个时间线(比如剪辑另一个版本),左侧的事件上右击新建项目: 另一个项目,在这上面可以继续时间线的创作,等于是选 ...

  8. [Contract] 一次搞懂 Solidity 的 using xx for xx

    using A for *;    # 把 A 的函数附给任意类型使用 using A for B; # 意思是把 A 中的方法附给 B 使用 使用上面的方式,那么在我们的合约中定义了 B 类型的变量 ...

  9. 习题8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim

    3. 编写一个8路彩灯控制程序,要求彩灯有以下3种演示花型. (1) 8路彩灯同时亮灭: (2) 从左至右逐个亮(每次只有1路亮): (3) 8路彩灯每次4路灯亮,4路灯灭,且亮灭相间,交替亮灭. 在 ...

  10. 还需要学习JDBC吗?如果需要该了解到怎么样的程度?

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家在工作中还有没有写过JDBC,我在大三 ...