首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当您在QNetworkReply中执行多个请求时,如何识别发出QtNetwork完成信号的请求?

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

Stack Overflow用户
提问于 2013-07-07 00:56:02
回答 1查看 3K关注 0票数 4

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

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

不过,我在弄清楚如何做到这一点上遇到了一些问题:

首先,我在堆栈溢出的某个地方读到,您应该只使用一个QNetworkAccess管理器。我不知道这是否属实。

问题是,我正在连接到单个QNetworkAccess管理器上已完成的插槽。如果我一次做不止一个请求,我不知道完成的信号是响应什么请求。我不知道是否有一种方法可以检查从信号中传递的QNetworkReply对象,以知道它响应的是什么响应?还是应该对每个请求使用不同的QNetworkAccessManager?

下面是一个例子,说明我现在是如何把东西链接在一起的。但我知道,当我同时做不止一个请求时,这是行不通的:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2013-07-07 07:01:22

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

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

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

是一个做同样事情的C++示例。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17508391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档