【问题标题】:How do you Identify the request that a QNetworkReply finished signal is emitted in response to when you are doing multiple requests In QtNetwork?当您在 QtNetwork 中执行多个请求时,如何识别发出 QNetworkReply 完成信号以响应的请求?
【发布时间】:2013-07-07 00:56:02
【问题描述】:

我有一个项目会加载一个 HTTP 页面,对其进行解析,然后根据它从第一页接收到的数据打开其他页面。

由于 Qt 的 QNetworkAccessManager 异步工作,看来我应该能够通过继续发出 HTTP 请求一次加载多个页面,然后按照回复返回的顺序处理响应,并且将是由偶数循环处理。

我在弄清楚如何做到这一点时遇到了一些问题:

首先,我在 stackoverflow 的某个地方读到,您应该只使用一个 QNetworkAccess 管理器。不知道是不是真的。

问题是我正在连接到单个 QNetworkAccess 管理器上的已完成插槽。如果我一次执行多个请求,我不知道完成信号响应的请求是什么。我不知道是否有办法检查从信号传递的 QNetworkReply 对象,以了解它响应的回复是什么?或者我实际上应该为每个请求使用不同的 QNetworkAccessManager 吗?

这是我现在如何将内容链接在一起的示例。但我知道当我一次处理多个请求时,这将不起作用:

from PyQt4 import QtCore,QtGui,QtNetwork

class Example(QtCore.QObject):
    def __init__(self):
        super().__init__()
        self.QNetworkAccessManager_1 = QtNetwork.QNetworkAccessManager()
        self.QNetworkCookieJar_1 = QtNetwork.QNetworkCookieJar()
        self.QNetworkAccessManager_1.setCookieJar(self.QNetworkCookieJar_1)
        self.app = QtGui.QApplication([])
    def start_request(self):
        QUrl_1 = QtCore.QUrl('https://erikbandersen.com/')
        QNetworkRequest_1 = QtNetwork.QNetworkRequest(QUrl_1)
        #
        self.QNetworkAccessManager_1.finished.connect(self.someurl_finshed)
        self.QNetworkAccessManager_1.get(QNetworkRequest_1)
    def someurl_finshed(self, NetworkReply):
        # I do this so that this function won't get called for a diffent request
        # But it will only work if I'm doing one request at a time
        self.QNetworkAccessManager_1.finished.disconnect(self.someurl_finshed)
        page = bytes(NetworkReply.readAll())
        # Do something with it
        print(page)
        QUrl_1 = QtCore.QUrl('https://erikbandersen.com/ipv6/')
        QNetworkRequest_1 = QtNetwork.QNetworkRequest(QUrl_1)
        #
        self.QNetworkAccessManager_1.finished.connect(self.someurl2_finshed)
        self.QNetworkAccessManager_1.get(QNetworkRequest_1)
    def someurl2_finshed(self, NetworkReply):
        page = bytes(NetworkReply.readAll())
        # Do something with it
        print(page)


kls = Example()
kls.start_request()

【问题讨论】:

    标签: qt http qnetworkaccessmanager


    【解决方案1】:

    我对 PyQt 不熟悉,但从一般 Qt 编程的角度来看

    • 仅使用一个 QNetworkAccessManager 是正确的设计选择
    • finished信号提供QNetworkReply*,我们可以使用request()识别对应的请求。

    我希望这能解决您的一个经理和多个请求的问题。

    This 是一个 C++ 示例。

    【讨论】:

    • get()(和 put() 等)也返回相应的 QNetworkReply*,因此如果需要,可以直接连接到它的 finished() 信号。
    • 更新了示例的断开链接
    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多