IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> PySide2中使用QLabel的setPixmap方法显示图片,部分图片无法显示 -> 正文阅读

[C++知识库]PySide2中使用QLabel的setPixmap方法显示图片,部分图片无法显示

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

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

  • 出现此问题可能是用于支持jpg的dll动态链接库没有加载成功;
  • 可以通过在代码中app = QApplication(sys.argv)后追加一行app.addLibraryPath(os.path.join(os.path.dirname(QtCore.__file__), "plugins"))手动添加动态链接库予以解决。

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

import sys

from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
pixmap = QPixmap('img/cat.jpg')
label = QLabel()
label.setPixmap(pixmap)
label.show()

app.exec_()

在这里插入图片描述
以上图片来自网络。
然后使用Pyside2试下:

import sys

from PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QApplication, QLabel

app = 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
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:31:54  更:2021-07-28 07:35:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/29 15:43:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码