PYQT5使用内存中的Qlabel显示图像



我正在尝试使用 QLabel(在代码段中称为 myLabel(显示图像。img_data是从数据库加载的二进制数据。因为我不知道如何从内存中直接获取qpixMap,所以我尝试将图像写入临时文件并将该文件加载到qpixmap构造函数中。

import tempfile
from PyQt5.QtGui import QPixmap

try:
    img_data = load_operation_that_might_fail()
except:
    myLabel.setText("no image available")
    return
with tempfile.NamedTemporaryFile("wb", prefix="qt-image-", suffix=".png") as file:
    file.write(img_data)
    file.flush()
    pixmap = QPixmap(file.name)
    myLabel.setPixmap(pixmap)

这在我的Ubuntu 18.04机器上正常工作,但是它在Windows 10上不起作用。在Windows上,它将正确显示no image available,但是当找到图像时,QLabel最终会变为空白,根本没有显示任何内容。

在两个操作系统上运行Python 3.7,都有新鲜安装的PyQt5软件包。

如何在Windows上完成此工作?也许有一种更优雅的方法可以避免编写临时文件?

您可以使用loadFromData

从内存中加载图像

在您的示例中,以下内容应起作用:

try:
    img_data = load_operation_that_might_fail()
except:
    myLabel.setText("no image available")
    return
pixmap = QPixmap()
myLabel.loadFromData(img_data, 'png')

这是一个完整的例子,只需在" c:/temp/test.png"中放置图像:

from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)
from PyQt5.QtGui import QPixmap
import sys

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        hbox = QHBoxLayout(self)
        pixmap = QPixmap()
        pixmap.loadFromData(self.load_operation_that_might_fail(), 'png')
        lbl = QLabel(self)
        lbl.setPixmap(pixmap)
        hbox.addWidget(lbl)
        self.setLayout(hbox)
        self.setWindowTitle('Example')
        self.show()

    def load_operation_that_might_fail(self):
        with open('c:/temp/test.png', 'rb') as f:
            return f.read()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

最新更新