如何使用 QNetworkRequest 将 Qlabel 与 jpg 一起使用?

Posted

技术标签:

【中文标题】如何使用 QNetworkRequest 将 Qlabel 与 jpg 一起使用?【英文标题】:How to use update Qlabel with jpg using QNetworkRequest? 【发布时间】:2014-01-13 04:43:18 【问题描述】:

我正在使用 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。

我将不胜感激有关如何使其正常工作的任何提示。

【问题讨论】:

你为什么要为这个操作创建一个 QLabel 子类? 嗨,我想让初始表单可以通过单击按钮来更新 Qlabel。到目前为止,我可以通过将代码放在 main() 中的 ImageLabel 类中创建带有图像的 Qlabel,但我无法通过将其放在其他任何地方来使其工作。我不知道如何处理nam.finished.connect(finishRequest)def finishRequest(reply): 部分。 你真的不需要一个子类。您可以将按钮单击连接到设置相应像素图的插槽...此外,您使用 imageLabel = ImageLabel(url) 而 ImageLabel 类没有这样的“init”方法参数...OT: “main()”作为一行在 python 中看起来很奇怪。 "我不知道如何处理 nam.finished.connect(finishRequest) 和 def finishRequest(reply): 部分。" -> 你到底关心什么? 由于我不熟悉插槽,您能写一些示例代码吗?我对nam.finished.connect(finishRequest)def finishRequest(reply) 的语法不是很熟悉,目前还看不到清晰的解释。 【参考方案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 类的类成员。

【讨论】:

您好,是的,网址应该是 QUrl 而不是 str,感谢您的纠正。我对你的回答有些困惑。通过创建 nam 和 myLabel 类成员,是否意味着在 MainForm 类中声明它们以便可以通过 self.nam 和 self.myLabel 访问它们? @wanyo:是的,我更新了答案,抱歉。昨晚我有一个 C++ 的心态,而不是 python'ish。 ;-) 我想问的是,如何创建 nam 和 myLabel 类成员?如果我尝试在 MainForm 类下声明它们以便可以通过 self.nam 和 self.myLabel 访问它们,我会收到一条错误消息,提示我必须在使用 QPaintDevice 之前构造一个 QApplication。此外,在将 finishRequest(reply) 方法添加到 Mainform 类并对 updatePhoto() 进行编辑后,我得到的问题是 finishRequest 未定义,并且该方法 finishRequest() 应该将 self 作为第一个参数。 我意识到我可能应该在 MainForm 类的构造函数部分而不是在它之外声明 nam 和 mLabel。这消除了 QPaintDevice 之前的 QApplicaton 问题。我认为现在的问题是如何正确声明和调用finishRequest,因为它目前无法访问myLabel。我将通过更改更新我的原始问题。谢谢。 @wanyo:我不确定我是否理解这个问题。如果它是类成员,您可以访问 myLabel,因为方法可以访问类成员。诚然,连接应该是 self.finishRequest 。如果出现其他问题,我稍后会编辑该错字。 OT:python 中没有构造函数,至少在 python 意义上,但是是的,init 方法看起来是一个有效的地方,因为它只在实例化时评估,而不是在模块加载时在外面。

以上是关于如何使用 QNetworkRequest 将 Qlabel 与 jpg 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Qt5 使用 QUrl / QNetworkRequest 将数据发布到服务器

如何从 QNetworkrequest 中删除标头?

在 Qt 中,QWebView 和 QNetworkRequest 不能共享 cookie

如何为我使用 QNetworkAccessManager 上传的图像设置 QNetworkRequest::ContentTypeHeader 和 QNetworkRequest::ContentLe

QNetworkRequest 不工作

重构为独立类后,QNetworkRequest (HTTP GET) 不会触发