PyQt и изображение в строке

#python #pyqt4

#python #pyqt4

Вопрос:

Почему этот код показывает мне окно без изображения? Я пытаюсь использовать QByteArray вместо StringIO, но у меня тот же результат. Кто-нибудь знает ответ?

 import sys
from PyQt4 import QtGui, QtCore
from StringIO import StringIO
class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        cs=StringIO()
        cs.write(open("image.jpeg",'rb').read())
        p = QtGui.QPixmap()
        p.loadFromData(cs.getvalue())
        lbl=QtGui.QLabel()
        lbl.setPixmap(p)
        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(lbl)
        self.move(20, 30)
        self.setWindowTitle('Picture')
        self.show()


app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
  

Обновить:
Мне нужно показать изображение из StringIO (или любого другого объекта в оперативной памяти), потому что я загружаю его с помощью pycurl без сохранения на жесткий диск.

ОБНОВЛЕНИЕ 2: Добавлено использование макета, как советовал Петр Викторин, но код все еще не работает.

ОБНОВЛЕНИЕ 3: @Petr Viktorin, этот код работает только тогда, когда я хочу отобразить файл PNG, но когда изображение — Jpeg / jpg, я вижу пустую форму. Может быть, проблема в QPixmap?

ОБНОВЛЕНИЕ 4: протестировано с различными изображениями, но …http://i39.tinypic.com/3535mqd.jpg Где проблема?

Комментарии:

1. Разве это не намного более простое решение? pic = QtGui.QPixmap(":/img/image.png")

2. Код работает для меня с использованием файлов PNG, JPG или SVG. Возможно, что-то не так с файлом изображения, который вы используете. Попробуйте несколько разных файлов JPG и загрузите их с p.loadFromData(cs.getvalue(), 'JPG') .

Ответ №1:

Вы не добавили метку в главное окно. Самым простым решением является:

 lbl=QtGui.QLabel(self)
  

И правильное решение — использовать некоторый макет, поэтому окно будет иметь соответствующий размер. Добавьте это после lbl.setPixmap(p) :

 layout = QtGui.QHBoxLayout(self)
layout.addWidget(lbl)