【Qt】png和jpg格式的图片(二)

本文分析了Qt中QLabel无法正确显示修改后缀的图片的原因,通过源码解析发现Qt主要通过文件后缀判断图片格式。在去除图片后缀名后,Qt能成功读取图片,说明其内部读取算法依赖于文件后缀。源码分析集中在QPixmap的load函数,该函数会检查文件后缀并尝试加载。结论是建议保留原始文件后缀以确保Qt正确识别图片。

背景

在上篇文章【Qt】png和jpg格式的图片(一) - 掘金 (juejin.cn)中笔者就 jpgpng 两种格式进行了说明,但是关于 Qt 打开改后缀文件名之后图片的问题依然没有说明。要探究Qt为何不能打开改了后缀的图片文件,这个还是得从多方面去定位。前文说了,通过三种方式设置了 QLabel 的图片。

场景复现

这里还是先说明一下设置不成功的场景如何复现:

  1. 找一张 .jpg 的图片,修改后缀也就是文件属性为 .png
  2. 通过以下三种方式中的任意一种去设置 QLabel 为图片。

Qt 版本是 5.9

编译器试了 MSVCmingw 都不好使。

QLabel 设置图片方法

  1. 通过 QPixmap设置 QLabel 的图片
QPixmap img(":/Win11.png");

ui->label->setPixmap(img);
ui->label->setScaledContents(true);
  1. 通过 QImage 设置 QLabel 的图片
QImage img;
img.load(":/Win11.png");
ui->label->setPixmap(QPixmap::fromImage(img))
  1. 通过 QLabel.setStyleSheet() 的图片
ui->label->setStyleSheet(QString("QLabel{"
                                 "border-image:url(:/Win11.png) 4 4 4 4 stretch stretch;"
                                 "}"));

当然还有第四种方法,通过 QSvgRenderer 设置:

#include <QSvgRenderer>

QSvgRenderer svgRender(QString(":/Win11.svg"));
QPixmap pixmap(20,20);
QPainter painter(&pixmap);
svgRender.render(&painter);
ui->label->setPixmap(pixmap);

场景是描述完了,可以动手尝试了

操作

接着就是去查看几种实现方式中的源码是如何是设置的了,这里先猜一下结论

就是 pngjpg 格式的算法不同,格式问题导致的读取的算法不一致,因此Qt内部实现的读取图片的算法只能根据图片文件的后缀所对应的算法去读取算法,而 setStyleSheet 算法也是基于这么一个逻辑,因此三种读取方式都不成功。

关于图片算法的问题,在上篇文章中也略微提到,这个我们不深做研究,只需知道 jpgpng 不是同一种算法,也不通用即可。

初步验证

因为上述几种步骤笔者都做过尝试,因此在验证过程中我们不纠结于使用哪一种方式,直接看结果。

  1. 那如何去验证呢,我们还是看代码,这次我们在 Qt 的 qrc 文件中,去掉图片的后缀名,不带后缀属性去读取图片看看其是否可以读取成功。

去掉后缀属性

运行结果: QLabel 读取成功

如上图所示,在 qrc 文件中去掉图片的后缀,读取图片设置到 QLabel 依然是成功的。

  1. 我们接着操作,在代码中修改图片后缀为 png,看看这次能不能读取成功。

修改后缀为png

运行结果:读取失败

如上图所示,添加后缀后反而还展示不成功了。

初步验证的结果

这就基本上说明了:

Qt 的内

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值