如何使用QNetworkRequest使用jpg更新Qlabel?

时间:2014-01-13 04:43:19

标签: qt pyqt qtgui qtnetwork qt-signals

我正在使用PyQt4创建一个表单,该表单使用Qlabel在单独的窗口中显示基于Web的图像。应该是单击表单上的按钮,通过从表单上的表格单元格中读取新图像URL,使用新图像更新Qlabel。

我认为我遇到的问题是不了解如何将Qlabel创建为类对象,然后我可以通过设置其setPixmap()属性来更新。这是我到目前为止所写的内容:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest


CAT_PICS = ["http://static.tumblr.com/ce35b04e242c6b8073f3ff7801147e9f/sz5wgey/obSmpcvso/tumblr_static_o-cats-kill-billions-facebook.jpg",
        "http://jasonlefkowitz.net/wp-content/uploads/2013/07/cats-16140154-1920-1080.jpg",
        "http://4.bp.blogspot.com/-MzZCzWI_6Xc/UIUQp1qPfzI/AAAAAAAAHpA/OTwHCJSWFAY/s1600/cats_animals_kittens_cat_kitten_cute_desktop_1680x1050_hd-wallpaper-753974.jpeg"]


class ImageLabel(QLabel):
    def __init__(self, parent=None):
        QLabel.__init__(self, parent)

        url = self.text()
        nam = QNetworkAccessManager()
        def finishRequest(reply):
            img = QImage()
            img.loadFromData(reply.readAll())
            myImage = QPixmap(img)

            self.setFixedSize(myImage.size())
            self.setPixmap(QPixmap(myImage))
        nam.finished.connect(finishRequest)
        nam.get(QNetworkRequest(QUrl(url)))



class MainForm(QDialog):
    index = 0
    def __init__(self):
        super(MainForm, self).__init__()

        changePhotoButton = QPushButton("Next Photo")
        layout = QHBoxLayout()
        layout.addWidget(changePhotoButton)
        self.setLayout(layout)

        self.connect(changePhotoButton, SIGNAL("clicked()"),
                     self.updatePhoto)


    def updatePhoto(self):
        url = CAT_PICS[self.index]
        imageLabel = ImageLabel(url)
        imageLabel.show()
        self.index += 1

def main():
    app = QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()
main()

代码将运行,但是当调用ImageLabel类时,QLabel是使用url中的初始文本创建的,但是从不提取图像,并且Qlabel会立即从视图中删除。

我很感激有关如何使其发挥作用的任何提示。

1 个答案:

答案 0 :(得分:1)

简而言之,我会删除自定义QLabel子类,并将扩展updatePhoto方法,如下所示。但是,您似乎没有正确处理该URL。

def __init__(self):
    self.myLabel = QLabel()
    self.nam = QNetworkAccessManager()
    self.nam.finished.connect(self.finishRequest)
    ...

def finishRequest(self, reply):
    myPixmap = QPixmap()
    if not myPixmap.loadFromData(reply.readAll()):
        print('Could not load')
    self.myLabel.setFixedSize(myImage.size())
    self.myLabel.setPixmap(myPixmap)
    self.myLabel.show()

def updatePhoto(self):
    url = CAT_PICS[self.index]
    self.nam.get(QNetworkRequest(QUrl(url)))
    self.index += 1

请注意,我会使用nam和myLabel作为相应的python类的类成员。