2014-01-13 17 views
1

我正在使用PyQt4创建一个窗体,使用Qlabel在单独的窗口中显示基于Web的图像。应该是单击表单上的按钮,通过从窗体上的表格单元格中读取新图像URL,使用新图像更新Qlabel。如何使用使用QNetworkRequest的jpg更新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被删除从立即查看。

我希望有关如何让这项工作的任何提示。

+0

你为什么要为这个操作制作一个QLabel子类? – lpapp

+0

嗨,我想这样做,以便初始表单可以通过单击按钮来更新Qlabel。到目前为止,我可以通过将代码放置在main()中的ImageLabel类中创建一个具有图像的Qlabel,但我无法通过将其放置在其他任何位置来使其工作。我不知道如何处理'nam.finished.connect(finishRequest)'和'def finishRequest(reply):'parts。 – wanyo

+0

你真的不需要这个子类。您可以将按钮点击连接到设置相应像素图的插槽...此外,您使用'imageLabel = ImageLabel(url)',而ImageLabel类没有这样的“__init__”方法参数... OT:“main ()“在Python中看起来很奇怪。 – lpapp

回答

1

简而言之,我会放弃自定义QLabel子类,并将扩展updatePhoto方法,如下所示。但是,似乎你没有正确处理网址。

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类的类成员。

+0

嗨,是的,该网址应该是类型QUrl而不是str,谢谢纠正。我对你的答案感到困惑。通过创建nam和myLabel类成员,这是否意味着要在MainForm类中声明它们,以便可以通过self.nam和self.myLabel访问它们? – wanyo

+0

@wanyo:是的,我更新了答案,道歉。昨天晚上我有一种C++思维,而不是python'ish。 ;-) – lpapp

+0

我的意思是要问,如何才能让nam和myLabel类成员?如果我尝试在MainForm类下声明它们,以便通过self.nam和self.myLabel访问它们,则会出现一个错误消息,说我必须在使用QPaintDevice之前构造一个QApplication。同样在向Mainform类添加finishRequest(reply)方法并对updatePhoto()进行编辑之后,我得到了finishRequest未定义以及该方法finishRequest()应该将self作为第一个参数的问题。 – wanyo