背景
在上篇文章【Qt】png和jpg格式的图片(一) - 掘金 (juejin.cn)中笔者就 jpg 和 png 两种格式进行了说明,但是关于 Qt 打开改后缀文件名之后图片的问题依然没有说明。要探究Qt为何不能打开改了后缀的图片文件,这个还是得从多方面去定位。前文说了,通过三种方式设置了 QLabel 的图片。
场景复现
这里还是先说明一下设置不成功的场景如何复现:
- 找一张
.jpg的图片,修改后缀也就是文件属性为.png- 通过以下三种方式中的任意一种去设置
QLabel为图片。Qt 版本是
5.9编译器试了
MSVC和mingw都不好使。
QLabel 设置图片方法
- 通过
QPixmap设置QLabel的图片
QPixmap img(":/Win11.png");
ui->label->setPixmap(img);
ui->label->setScaledContents(true);
- 通过
QImage设置QLabel的图片
QImage img;
img.load(":/Win11.png");
ui->label->setPixmap(QPixmap::fromImage(img))
- 通过
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);
场景是描述完了,可以动手尝试了
操作
接着就是去查看几种实现方式中的源码是如何是设置的了,这里先猜一下结论
就是
png和jpg格式的算法不同,格式问题导致的读取的算法不一致,因此Qt内部实现的读取图片的算法只能根据图片文件的后缀所对应的算法去读取算法,而setStyleSheet算法也是基于这么一个逻辑,因此三种读取方式都不成功。关于图片算法的问题,在上篇文章中也略微提到,这个我们不深做研究,只需知道
jpg和png不是同一种算法,也不通用即可。
初步验证
因为上述几种步骤笔者都做过尝试,因此在验证过程中我们不纠结于使用哪一种方式,直接看结果。
- 那如何去验证呢,我们还是看代码,这次我们在 Qt 的
qrc文件中,去掉图片的后缀名,不带后缀属性去读取图片看看其是否可以读取成功。

运行结果: QLabel 读取成功
如上图所示,在 qrc 文件中去掉图片的后缀,读取图片设置到 QLabel 依然是成功的。
- 我们接着操作,在代码中修改图片后缀为
png,看看这次能不能读取成功。

运行结果:读取失败
如上图所示,添加后缀后反而还展示不成功了。
初步验证的结果
这就基本上说明了:
在
Qt的内

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

被折叠的 条评论
为什么被折叠?



