PyQt5添加二维码图片报错:ImageQt类型不匹配问题求助
解决PyQt5中二维码图片显示的TypeError问题
问题场景
开发二维码项目时,需要将链接转为二维码并在PyQt5窗口中直接显示(无需保存文件),使用qrcode库实现,但运行代码时报错:
TypeError: fromImage(QImage, flags: Union[Qt.ImageConversionFlags, Qt.ImageConversionFlag] = Qt.AutoColor): argument 1 has unexpected type 'ImageQt'
测试代码如下:
from PyQt5 import QtWidgets from PyQt5 import QtGui import sys import qrcode qr_coda_as_an_image = qrcode.make("Link") qr_coda_as_an_image = qr_coda_as_an_image.get_image() qr_coda_as_an_image = qr_coda_as_an_image.toqimage() app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.resize(800,500) window_layout = QtWidgets.QGridLayout() image = QtGui.QPixmap.fromImage(qr_coda_as_an_image) first_widget = QtWidgets.QLabel() first_widget.setPixmap(image) window_layout.addWidget(first_widget) window.setLayout(window_layout) window.show() app.exec()
问题原因
qrcode.make()返回的是PIL Image对象,调用toqimage()后得到的是PIL的ImageQt包装对象,而非PyQt5原生的QImage类型,导致QPixmap.fromImage()无法识别。
解决方案
有两种可行的修正方式:
方式1:提取ImageQt内部的原生QImage
直接获取ImageQt对象封装的QImage实例:
from PyQt5 import QtWidgets from PyQt5 import QtGui import sys import qrcode from PIL.ImageQt import ImageQt qr_coda_as_an_image = qrcode.make("Link") qr_coda_as_an_image = qr_coda_as_an_image.get_image() # 转换为ImageQt后提取内部QImage image_qt = ImageQt(qr_coda_as_an_image) q_image = image_qt.qimage app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.resize(800,500) window_layout = QtWidgets.QGridLayout() image = QtGui.QPixmap.fromImage(q_image) first_widget = QtWidgets.QLabel() first_widget.setPixmap(image) window_layout.addWidget(first_widget) window.setLayout(window_layout) window.show() app.exec()
方式2:通过字节流直接创建QImage
绕过ImageQt,将PIL图像转为字节流后直接加载为QImage:
from PyQt5 import QtWidgets from PyQt5 import QtGui from PyQt5.QtCore import QByteArray, QBuffer import sys import qrcode qr_coda_as_an_image = qrcode.make("Link") # 将PIL图像转为PNG字节流 buffer = QBuffer() buffer.open(QBuffer.ReadWrite) qr_coda_as_an_image.save(buffer, "PNG") # 从字节流加载QImage q_image = QtGui.QImage() q_image.loadFromData(buffer.data()) app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.resize(800,500) window_layout = QtWidgets.QGridLayout() image = QtGui.QPixmap.fromImage(q_image) first_widget = QtWidgets.QLabel() first_widget.setPixmap(image) window_layout.addWidget(first_widget) window.setLayout(window_layout) window.show() app.exec()
内容的提问来源于stack exchange,提问作者Mohammed almalki
相关产品推荐
相关产品推荐

