Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当您在QtNetwork中执行多个请求时,如何识别发出QNetworkReply完成信号的请求?_Qt_Http_Qnetworkaccessmanager - Fatal编程技术网

当您在QtNetwork中执行多个请求时,如何识别发出QNetworkReply完成信号的请求?

当您在QtNetwork中执行多个请求时,如何识别发出QNetworkReply完成信号的请求?,qt,http,qnetworkaccessmanager,Qt,Http,Qnetworkaccessmanager,我有一个项目将加载一个HTTP页面,解析它,然后根据从第一个页面接收到的数据打开其他页面 由于Qt的QNetworkAccessManager是异步工作的,因此我似乎可以通过继续发出HTTP请求一次加载多个页面,然后按照回复返回的顺序处理响应,并由偶数循环处理 不过,我在想如何做到这一点时遇到了一些问题: 首先,我在stackoverflow的某个地方读到,您应该只使用一个QNetworkAccess管理器。我不知道这是不是真的 问题是我正在连接到单个QNetworkAccess管理器上的已完成

我有一个项目将加载一个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()

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

  • 仅使用一个QNetworkAccessManager是正确的设计选择
  • 信号提供了
    QNetworkReply*
    ,我们可以使用它来识别相应的请求
我希望这将解决您的问题,一个经理和多个请求


是一个C++示例,同样的。

GET()(和()等)也返回相应的QNETWrWorkRead,因此如果需要的话,可以直接连接到它的FixSee()信号。