如何识别QNetworkReply完成信号的响应请求,以响应您在QtNetwork中执行多个请求的时间?

Aze*_*ale 4 qt http qnetworkaccessmanager

我有一个项目将加载一个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()
Run Code Online (Sandbox Code Playgroud)

ank*_*ckt 6

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

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

我希望这可以通过一个经理和多个请求解决您的问题.

是一个做同样的C++示例.

  • get()(和put()等)也返回相应的QNetworkReply*,因此如果需要,可以直接连接到其finished()信号. (2认同)