之前一直是用PyQt5的,最近的项目由于担心开源协议的问题,开始使用PySide2,没想到在简单的图片显示上就出现了问题。
问题的表现是这样的,对于有的.jpg图片,使用PyQt5是完全可以正常显示的,但是一旦换成PySide2就不行。

由于后面内容较长,所以先说解决方法:

  • 出现此问题可能是用于支持jpg的dll动态链接库没有加载成功;
  • 可以通过在代码中app = QApplication(sys.argv)后追加一行app.addLibraryPath(os.path.join(os.path.dirname(QtCore.__file__), "plugins"))手动添加动态链接库予以解决;
  • 【补充】在另一个项目中发现使用上述方法仍然无效,然后发现通过在app = QApplication(sys.argv)这一行之前添加一行QImageReader.supportedImageFormats()之后可以解决,原因不明。如有知晓原因者欢迎留言;
  • 【再补充】PySide2拜拜了你爷不伺候了,直接PySide6走你,以上问题都没有了。

给出两段示例代码。
PyQt5是没问题的:

import sysfrom PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QLabelapp = QApplication(sys.argv)
pixmap = QPixmap('img/cat.jpg')
label = QLabel()
label.setPixmap(pixmap)
label.show()app.exec_()


以上图片来自网络。
然后使用Pyside2试下:

import sysfrom PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QApplication, QLabelapp = QApplication(sys.argv)
pixmap = QPixmap('img/cat.jpg')
label = QLabel()
label.setPixmap(pixmap)
label.show()app.exec_()

可以看到窗口是空的。

我的问题排查过程如下:

  • 首先,我去读了一下Qt的文档(我一般看C++ Qt的文档,比较详细些,API都差不多),我调用的pixmap = QPixmap('img/cat.jpg')这个方法,对应的文档地址是https://doc.qt.io/qt-5/qpixmap.html#QPixmap-2:

    从文档可知,该方法的第二个参数就是图片格式。关于Qt支持的格式的详细信息,在图中红框的链接处。
  • 我点进去,文档内容如下:

文档中支持的图片格式是有jpg的,但是为啥我无法显示jpg呢?

  • 我看到文档中说可以通过QImageReader::supportedImageFormats()查看,于是我就在上面的代码中加上一行print(QImageReader.supportedImageFormats()),对于PyQt5的那段代码,输出结果是:
    [PyQt5.QtCore.QByteArray(b'bmp'), PyQt5.QtCore.QByteArray(b'cur'), PyQt5.QtCore.QByteArray(b'gif'), PyQt5.QtCore.QByteArray(b'icns'), PyQt5.QtCore.QByteArray(b'ico'), PyQt5.QtCore.QByteArray(b'jpeg'), PyQt5.QtCore.QByteArray(b'jpg'), PyQt5.QtCore.QByteArray(b'pbm'), PyQt5.QtCore.QByteArray(b'pgm'), PyQt5.QtCore.QByteArray(b'png'), PyQt5.QtCore.QByteArray(b'ppm'), PyQt5.QtCore.QByteArray(b'svg'), PyQt5.QtCore.QByteArray(b'svgz'), PyQt5.QtCore.QByteArray(b'tga'), PyQt5.QtCore.QByteArray(b'tif'), PyQt5.QtCore.QByteArray(b'tiff'), PyQt5.QtCore.QByteArray(b'wbmp'), PyQt5.QtCore.QByteArray(b'webp'), PyQt5.QtCore.QByteArray(b'xbm'), PyQt5.QtCore.QByteArray(b'xpm')]
    里面是有jpeg的。
    但是Pyside2那段代码的结果是:
    [PySide2.QtCore.QByteArray(b'bmp'), PySide2.QtCore.QByteArray(b'pbm'), PySide2.QtCore.QByteArray(b'pgm'), PySide2.QtCore.QByteArray(b'png'), PySide2.QtCore.QByteArray(b'ppm'), PySide2.QtCore.QByteArray(b'xbm'), PySide2.QtCore.QByteArray(b'xpm')]
    可以看到,里面没有jpg,难怪jpg的图片无法显示。
  • 然后我继续在网上搜索,在一个贴吧里(地址:https://tieba.baidu.com/p/7130333819)看到有贴吧大佬提示可能是dll加载异常,建议加上一行
QtCore.QCoreApplication.addLibraryPath(os.path.join(os.path.dirname(QtCore.__file__), "plugins"))

我照着做了,但是还是不行。

  • 我想看看这个路径里到底是啥东西,于是在代码里加上一行print(os.path.dirname(QtCore.__file__)),输出结果是C:\Anaconda3\envs\pytorch_py37\lib\site-packages\PySide2,这个结果其实就是anaconda环境下Pyside2的包,打开该文件夹的plugins文件夹,可以看到里面有个imageformats文件夹,里面是:

    里面有一个qjpeg.dll,显然贴吧大佬说的应该就是这个dll了。
  • 同时,我在StackOverflow上(地址:https://stackoverflow.com/questions/10739758/qlabel-wont-load-a-pixmap-if-it-is-a-jpg-image)看到,加载qjpeg.dll库是通过app.addLibraryPath(path)实现的(这个老外还提到路径只需要放在plugins这一级,不要放在plugins/imageformats下),于是我改了一下贴吧大佬给出的那一行代码如下:
app.addLibraryPath(os.path.join(os.path.dirname(QtCore.__file__), "plugins"))
  • 终于,PySide2成功地在QLabel中显示jpg图片了。。。。

不知是否还有其他小伙伴也遇到了这个问题,希望能有所帮助,欢迎在评论区交流。

参考资料:

  • https://doc.qt.io/qt-5/qpixmap.html#QPixmap-2
  • https://doc.qt.io/qt-5/qpixmap.html#reading-and-writing-image-files
  • https://tieba.baidu.com/p/7130333819#136830331399l
  • https://stackoverflow.com/questions/50209879/how-to-load-an-image-with-qlabel-in-pyside2
  • https://stackoverflow.com/questions/10739758/qlabel-wont-load-a-pixmap-if-it-is-a-jpg-image

PySide2中使用QLabel的setPixmap方法显示图片,部分图片无法显示相关推荐

  1. php关闭notice_PHP_屏蔽PHP默认设置中的Notice警告的方法,PHP的默认设置是显示Notice警告 - phpStudy...

    屏蔽PHP默认设置中的Notice警告的方法 PHP的默认设置是显示Notice警告提示,这会造成页面无法正常显示出来.你有没定义的变量直接使用了.不过编PHP的时候本来就不像C++那么严格,编程的时 ...

  2. qt5设置linux系统时间,Qt中使用QLabel显示时间的两种方法

    Qt中使用QLabel显示时间的两种方法思路一致,只是实现方法不一样而已. main.cpp #include "displaytime.h" #include int main( ...

  3. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信

    你说的show是swing里的吧,在老版本中Component这个超类确实有show这个方法,而且这个方法也相当有用,使一个窗口可见,并放到最前面.在jdk5.0中阻止了这个方法,普遍用setVisi ...

  4. Qt 实现QT控件中的QLabel显示图片并自适应显示

    一.需求 实现QT控件中的QLabel显示图片,并自适应显示. 二.代码 QImage Image; Image.load(":/image/image/logo.jpg"); Q ...

  5. html图片的隐藏与显示,Jquery中使用show()与hide()方法动画显示和隐藏图片

    (1)功能描述 在页面中单击"显示"连接,通过show()方法以动画的方式显示一幅图片,同时在方法中执行一个回调函数,用于改变图片的边框样式:单击已显示的图片时,通过hide()以 ...

  6. word中图片为嵌入式格式时显示不全_打印Word图片显示不全 Word2007图片显示不全解决方法...

    打印Word图片显示不全 Word2007图片显示不全解决方法,平凡的世界平凡的你,努力学习使我们变得不平凡,今天要介绍的知识是打印Word图片显示不全的相关知识,你准备好学习打印Word图片显示不全 ...

  7. 关于van-card中thumb引入本地图片而无法正常显示的解决方法

    关于van-card中thumb引入本地图片而无法正常显示的解决方法 前言 解决办法 总结 前言 最近在弄一个微信公众号,是H5前端,用到的是vant组件. 当然Vant的官方文档以及例子都有,但是很 ...

  8. android 按钮 图片文字居中显示,[Android]Android 布局中如何让图片和文字居中显示?...

    图片文字居中显示 **①组件TextView的属性 drawableTop ``` 块内或者行内图片与文字居中对齐最靠谱的方式! 做图片与文字在一行的按钮时候最常用到,总结了一个靠谱的方法,终于可以完 ...

  9. html中#include file的使用方法

    有两个文件a.htm和b.htm,在同一文件夹下a.htm内容例如以下 <!-- #include file="b.htm" --> b.htm内容例如以下 今天:雨 ...

最新文章

  1. mysql 小型机_小型机宕机问题 - Oracle数据库管理 - ITPUB论坛-中国专业的IT技术社区...
  2. python如何创建不同元素的矩阵_python – 如何在数据帧中创建矩阵元素的数...
  3. R语言使用ggpubr包的ggarrange函数组合多张结论图:使用ggpubr包在散点图的侧面添加辅助图形、并使用NULL将不需要可视化的侧面留白
  4. 自动驾驶又陷“派系”之争:该约束行人还是让车更完美
  5. 【Keras】学习笔记(二)
  6. 【python】输出到文件, f.write与print
  7. java单分支结构,java基础语法分支结构
  8. C# if---else---练习题整理
  9. Battery Health 3 for Mac(电池健康管理工具)
  10. lr_save_string 和 sprintf 的使用
  11. 【Python】基于Python的百度迁徙(2020年10月21日更)
  12. linux版本信息i686,i686 linux gnu
  13. Python3—爬虫实现有道在线翻译—(常见错误汇总及解决方法)
  14. 管理培训决定企业生死的5个层面
  15. Linux系统ssd硬盘擦除,如何实现安全擦除 _固态硬盘小Z聊固态-中关村在线
  16. Jenkins基础:API:10:使用API更新进行节点的连接和断开
  17. 如何利用GitHub搜索敏感信息
  18. 单片机GPIO端口是干什么的?
  19. 黑群晖安装界面提示sata端口被禁用
  20. 荣耀平板5鸿蒙降级安卓并刷入原生Android12系统——麒麟659,4+64G,10英寸wifi版本

热门文章

  1. 麦积机器人_天水市一中麦积校区师生在“青少年机器人竞赛”活动中再创佳绩...
  2. TL-1到底是什么?
  3. 神经网络的基本构成要素,构成神经网络的三要素
  4. [C++] 什么是智能指针(Smart Pointer)以及何时使用
  5. 硬件/操作系统/网络(十二):网络基本概念的知识扫盲
  6. 微创居然被唐骏买了,顺便挖挖里面的内部
  7. MySQL基础(二十八)索引优化与查询优化
  8. FixMatch论文摘记
  9. BT种子怎么用 BT种子怎么下载 BT种子是什么意思
  10. GOOGLE服务地址入口