QT绘图类 QPixmap、QImage、QPicture、QBitmap

2023-12-19 19:52

本文主要是介绍QT绘图类 QPixmap、QImage、QPicture、QBitmap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

绘图设备是指继承 QPaintDevice 的子类,你可以使用 QPainter 直接在其上面绘制图形,Qt 一共提供了四个这样继承 QPaintDevice 的绘图设备类,分别是:QPixmap、QBitmap、QImage和 QPicture。其中:

  • QPixmap是为在屏幕上显示图像而设计和优化;
  • QBitmap是 QPixmap 的一个子类,它的色深限定为 1,你可以使用 QPixmap 的 isQBitmap() 函数来确定这个QPixmap 是不是一个 QBitmap;
  • QImage是为 I/O 和直接像素访问和操作而设计和优化;
  • QPicture是一个绘图装置,用于记录和重播Qpainter的绘图指令;

1.QPixmap和QBitmap

QPixmap继承了QPaintDevice,因此,可以使用QPainter直接在上面绘制图形。QPixmap也可以接受一个字符串作为一个文件的路径来显示这个文件,比如你想在程序之中打开png、jpeg之类的文件,就可以使用 QPixmap。使用QPainter的drawPixmap()函数可以把这个文件绘制到一个QLabel、QPushButton或者其他的设备上面。

QPixmap是针对屏幕上显示图像而进行特殊优化的,因此,它与实际的底层显示设备息息相关。注意,这里说的显示设备并不是硬件,而是操作系统提供的原生的绘图引擎。所以,在不同的操作系统平台下,QPixmap的显示可能会有所差别。

QBitmap继承自QPixmap,因此具有QPixmap的所有特性,但只提供单色图像,也就是说QBitmap实际上是只有黑白两色的图像数据。由于QBitmap色深小,因此只占用很少的存储空间,所以适合做光标文件和笔刷。

程序演示:

void Widget::paintEvent(QPaintEvent *)
{QPainter p(this);//定义画家//QPixmap 图片背景透明//p.drawPixmap(0,0,200,200,QPixmap("../image/10.jpg"));//QBitmap 图片背景透明//p.drawPixmap(200,0,200,200,QBitmap("../image/10.jpg"));//QPixmap 图片背景白色QPixmap pixmap;pixmap.load("../image/pig.jpg");p.drawPixmap(0,200,200,200,pixmap);//QPixmap 图片背景白色QBitmap bitmap;bitmap.load("../image/pig.jpg");p.drawPixmap(200,200,200,200,bitmap);
}

结果:

                        

参考:Qt5基础 QPixmap和QBitmap的区别_qbit qt-CSDN博客

2. QImage

由于QImage是独立于硬件的,也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,使用这一方式可以很大幅度提高UI响应速度;

QImage 类用于加载图像文件,可选地操作图像数据,然后将 QImage 对象转换为 QPixmap 以显示在屏幕上。或者,如果不需要任何操作,可以将图像文件直接加载到 QPixmap 中,

QImage 则是使用独立于硬件的绘制系统,实际上是自己绘制自己,因此提供了像素级别的操作,并且能够在不同系统之上提供一个一致的显示形式。

代码如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QImage image(300, 200, QImage::Format_RGB888);image.fill(Qt::white);QPainter painter(&image);painter.setPen(QPen(Qt::black, 5));painter.drawRect(QRect(30, 30, 240, 140));painter.setFont(QFont("Arial", 16, QFont::Bold));painter.drawText(QPoint(65, 85), "Hello QImage!");ui->label->setPixmap(QPixmap::fromImage(image));}

结果:

 如需深入了解QImage类可以参考:QImage类的使用-CSDN博客

Qt实战案例(36)——利用QImage类实现对图像的基本操作(图像显示、图像缩放、图像旋转)_qimage 旋转-CSDN博客

3.QPicture

记录和回放QPainter的绘图指令

  • begin() 开始在QPicture上绘图 
  • end() 结束在QPicture上绘图 
  • save() 保存操作为.pic文件 
  • load() 加载.pic文件

构造函数种保存图片

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPicture picture;QPainter painter;painter.begin(&picture);painter.drawEllipse(10,20,80,70);painter.end();picture.save("my.pic");}

paintEvent函数种加载图片

void MainWindow::paintEvent(QPaintEvent* e)
{QPicture picture;picture.load("my.pic");QPainter painter;painter.begin(this);painter.drawPicture(0,0,picture);painter.end();
}

结果:

参考:Qt 处理图像数据的类区别(QPixmap、QImage、QPicture)-CSDN博客

这篇关于QT绘图类 QPixmap、QImage、QPicture、QBitmap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用