QPixmap依赖于硬件,QImage不依赖于硬件。QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的。
当图片小的情况下,直接用QPixmap进行加载,画图时无所谓,当图片大的时候如果直接用QPixmap进行加载,会占很大的内存,一般一张几十K的图片,用QPixmap加载进来会放大很多倍,所以一般图片大的情况下,用QImage进行加载,然后转乘QPixmap用户绘制。QPixmap绘制效果是最好的。

QIcon testIcon("\\blankProject\\temp.bmp");
->setIcon(testIcon); ->setIcon(QIcon("\\blankProject\\temp.bmp"));
->setIconSize(QSize(200,200));

setIconSize():设置图标大小,参数是QSize类型

QPixmap dlg(":/picture/dialog.png");
->setFixedSize(dlg.size());
->setPixmap(dlg);

dlg.size():获取图片的大小,返回的是QSize类型

QPixmap objPixmap;
objPixmap.load(imgfile);//加载图片
->setIcon(QIcon(objPixmap.scaled(QSize(100,100))));

QPixmap::scaled()
根据给定的尺寸来放大缩小QPixmap

QIcon 类代表图标,实现在 QtGui 共享库中。QIcon 对象可以认为是一系列图像的组合,每个图像代表窗口在某种状态下应该1显示的图标。

QIcon();   // 构造一个空图像构成的图标
QIcon(const QPixmap &pixmap); // 从 Pixmap 对象构造函数
QIcon(const QString &filename); // 从图像文件构造图标
当从 QPixmap 对象构造图标时,系统会自动产生窗口不同状态下对应的图像,比如窗口在禁用状态下其图标为灰色。从文件构造图标时,文件并不是立刻加载,而是当图标要显示时才加载。

添加图像
下面的成员函数可以从图像文件中向 QIcon 对象添加图像:

void addFile(const QString &filename, const QSize &size = QSize(), Mode mode = Normal, State state = Off);  

其中各个参数的含义解释如下。
1)filename:文件名。
2)size:指定大小。
3)mode:指定使用模式,即窗口在何种状态下使用这个图像。
4)state:指定使用状态。
Mode 为 QIcon 类的成员类型,有以下取值。
1)QIcon::Normal:窗口为使能状态,但未激活。
2)QIcon::Disabled:窗口为禁用状态。
3)QIcon::Active:窗口为激活状态。
4)QIcon::Selected:窗口被选中。
当窗口的状态切换时,默认的图标绘制函数会自动根据窗口的状态重绘图标。如果窗口还有所谓的开关状态(比如一个按钮可以有按下和弹起两个状态),则还可以根据 state 参数来选择不同的图像。state 参数为 State 类型,这也是一个 QIcon 类的成员类型,它有以下取值。
QIcon::Off:窗口在关状态。
QIcon::On:窗口在开状态。
另外一个成员函数可以直接将 QPixmap 对象添加到 QIcon 对象中:

void addPixmap(const QPixmap &pixmap, Mode mode = Normal, State state = Off);  

这里的 pixmap 参数是要添加的 QPixmap 对象,mode 参数和 state 参数的含义与 addFile 函数中相同。

获取图像
下面的成员函数可以获取 QIcon 对象中的图像

QPixmap pixmap(const QSize &size, Mode  mode = Normal, State state = Off) const;

其中参数 size 是指定的大小,参数 mode 和 state 则是使用模式和状态。这个函数还有以下重载版本:

QPixmap pixmap(int w, int h, Mode mode = Normal, State state = Off) const;
QPixmap pixmap(int extent, Mode mode = Normal, State state = Off) const;

它们分别等价于以下的函数调用:
注意返回的图像大小可能比指定的小,但不会比指定的大。

判断 以下成员函数可以判断 QIcon 对象是否为空图像构成的图标:

bool isNull() const; // 判断是否为空图像构成的图标  

问题:

QPixmap p;
p.load("1.png");
label->setPixmap(p);
p.load("2.png");
label->setPixmap(p);
p.load("1.png");
label->setPixmap(p);

当用同一个p,
即全局变量时,你加载图片1,显示图片1;再加载图片2,显示图片2;可当你再想变回图片一时,你再加载图片一,不好使了,变不回来了,还是显示图片二,你在加载个图片三,好使,再想变回图片二,不好使了。。。。。。

这是为神马呢???

原来,p.load()是将图片加载到缓冲区中:QPixmapCache,当你加载图片二是,图片一并没有被覆盖,此时缓冲区内有图片一和图片二,当你再次加载图片一时,以为缓冲区里应经有了,所以p.load(),直接返回true;但是图片仍是图片二,所以不能显示回图片一!

解决办法很简单,有三种办法:

一、 直接定义局部变量,这样每次都是新的缓冲区;

二、 当再次加载图片时,先将缓冲区清空, QPixmapCache::clear();然后再加载;

三、 在初始化函数里写:QPixmapCache::setCacheLimit(1);设置缓冲区内只能放一张图片,这样就会替换原来的

QPixmap、QIcon和QImage的更多相关文章

  1. 如何正确地在手机上显示图片——QImage与QPixmap完全解析

    引言 用Qt程序在手机上显示一幅图片对编程人员来说是再基础不过的一件事情了.那么先让大家看两段代码: //dangerous should not be used, cannot display ea ...

  2. QImage与QPixmap完全解析

    转载自http://www.civilnet.cn/bbs/browse.php?topicno=4691 用Qt程序在手机上显示一幅图片对编程人员来说是再基础不过的一件事情了.那么先让大家看两段代码 ...

  3. Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转

    Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转 (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthr ...

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

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

  5. 如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

    问题描述 如今显示器的分辨率越来越高,如果不启用 DPI 缩放,软件的字体和图标在高分屏下就会显得非常小,看得很累人.从 5.6 版本开始,Qt 便能支持 DPI 缩放功能,Qt6 开始这个功能是默认 ...

  6. 将Mat类型转换成QImage类型

    ui 头文件 #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include<opencv2/highgui/highgu ...

  7. QPixmap 和 HBITMAP互转

    Q_GUI_EXPORT HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat = 0); 声明这一句后, 就可以 ...

  8. Qt之资源系统

    简述 Qt 的资源系统用于存储应用程序的可执行二进制文件,它采用平台无关的机制.当你的程序总需要这样的一系列文件(图标.翻译文件等)并且不想冒丢失某些文件的风险时,这就显得十分有用. 资源系统基于 q ...

  9. QWidget与HWND的互相转换

    QWidget与HWND的互相转换 在编写Windows的应用程序时,我们有时不可避免地要与Windows平台固有的Win32 API打交道,但是Win32 API里面常常用到的HWND等诸多句柄QT ...

  10. QtGUI Module's Classes

    Qt GUI C++ Classes The Qt GUI module provides the basic enablers for graphical applications written ...

随机推荐

  1. ChatGPT的探索与实践-业务应用篇

    本篇文章主要介绍在实际的开发过程当中,如何使用GPT帮助开发,优化流程,恰逢今年京东20周年庆,文末会介绍如何与618大促实际的业务相结合,来提升应用价值.全是干货,且本文所有代码和脚本都是利用GPT ...

  2. 基于LLVM的海量数据排序算法研究。(二维表的排序算法)

    当待排序数据内容大于内存容量时,需将待排序内容分块,要进行排序的分块传入内存,未处于排序状态的存入外存,外存的读写时间是内存的百万倍,因此在内外存储器之间传输分块所消耗的 I/O 时间是大数据排序算法 ...

  3. 我真的想知道,AI编译器中的IR是什么?

    随着深度学习的不断发展,AI 模型结构在快速演化,底层计算硬件技术更是层出不穷,对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来,还要应对 AI 框架的持续迭代. AI 编译器就 ...

  4. CMDB 相关

    CMDB 术语 CI(配置项) 配置管理解决方案(如CMDB)中的基本有形或无形实体. 为了交付IT服务而需要管理的任何组件. 通常包括IT服务.硬件.软件.架构.人员和正式文档(如流程文档和sla) ...

  5. Typescript:基础语法学习(尚硅谷 李立超)

    官方文档:https://www.tslang.cn/docs/handbook/typescript-in-5-minutes.html 搭建开发环境 npm i -g typescript安装完成 ...

  6. ValueError: Max value is 14 解决方案

    方案一(有时会失效): 将EXCEL文件中的格式全部清除即可.最好是复制,然后只粘贴值. 方案二(指定引擎): data = pd.read_excel(path, engine="open ...

  7. Python工具箱系列(三十九)

    使用zlib对数据进行压缩 现实世界中,大量存在着对数据压缩的需求.为此,python内置了zlib压缩库,可以方便的对任意对象进行压缩. 下述代码演示了对字符串进行压缩: import zlib # ...

  8. 让nodejs开启服务更简单--koa篇

    在nodejs原始的http模块中,开启一个服务编码相对麻烦,需要对请求方式及上传的数据进行各种判断,而koa给我们提供了比较便捷的编码方式,同时它还有很多中间件可以直接拿来使用.   首先来看,如何 ...

  9. github.com/yuin/gopher-lua 踩坑日记

    本文主要记录下在日常开发过程中, 使用 github.com/yuin/gopher-lua 过程中需要注意的地方. 后续遇到其他的需要注意的事项再补充. 1.加载LUA_PATH环境变量 在实际开发 ...

  10. 杰哥教你面试之一百问系列:java中高级多线程concurrent的使用

    目录 问题1:什么是ConcurrentHashMap?它与HashMap的区别是什么? 问题2:什么是CopyOnWriteArrayList?它适用于什么样的场景? 问题3:什么是Blocking ...