Qt 有什么方法可以获取QNetworkAccessManager队列的信息吗?

Qt 有什么方法可以获取QNetworkAccessManager队列的信息吗?,qt,pyqt,queue,pyside,qnetworkaccessmanager,Qt,Pyqt,Queue,Pyside,Qnetworkaccessmanager,从: 注意:QNetworkAccessManager将收到的请求排队 现在,我想做两件事(使用PyQt): 检查QNetworkAccessManager的“内部”队列中有多少请求等待发送 检查有多少请求收到了答复(即计算完成的QNetworkReplies的数量) 我假设QNetworkAccessManager内部已经可以使用此信息,但我还没有找到访问它的方法。我在Qt文档或其他地方找不到任何东西,但可能我找错了地方或使用了错误的术语 有人能告诉我Qt是否提供了一些方法来访问有关QNetw

从:

注意:
QNetworkAccessManager
将收到的请求排队

现在,我想做两件事(使用PyQt):

  • 检查
    QNetworkAccessManager
    的“内部”队列中有多少请求等待发送
  • 检查有多少请求收到了答复(即计算完成的QNetworkReplies的数量)
  • 我假设
    QNetworkAccessManager
    内部已经可以使用此信息,但我还没有找到访问它的方法。我在Qt文档或其他地方找不到任何东西,但可能我找错了地方或使用了错误的术语

    有人能告诉我Qt是否提供了一些方法来访问有关
    QNetworkAccessManager
    队列的信息吗

    为了清楚起见:我自己可以想出一些方法来跟踪这些事情,例如通过检查各个QNetworkReply状态,但这不是我正在寻找的解决方案(如果Qt不能提供更简单的方法,只能作为最后手段)

    ---编辑---

    这是我心目中的一个稍小但仍然微不足道的例子:

    import sys
    import json
    from PyQt4 import QtNetwork, QtGui, QtCore
    
    def show_reply_content(reply):
        print 'url from reply content: {}'.format(
            json.loads(str(reply.readAll()))['url'])
    
        # Quit if all replies are finished
        reply.deleteLater()
        reply.manager().replies_unfinished -= 1
        if not reply.manager().replies_unfinished:
        app.quit()
    
    # Some initialization
    app = QtGui.QApplication(sys.argv)
    manager = QtNetwork.QNetworkAccessManager()
    manager.finished.connect(show_reply_content)
    
    # Add counter as dynamic attribute (quick and dirty)
    manager.replies_unfinished = 0
    
    # Schedule some dummy requests
    number_of_requests = 10
    for i in range(number_of_requests):
        manager.get(QtNetwork.QNetworkRequest(
            QtCore.QUrl('http://httpbin.org/anything/{}'.format(i))))
    
        # Update counter
        manager.replies_unfinished += 1
    
    # Start event loop
    app.exec_()
    

    在这种情况下,管理器发出的
    allFinished
    信号将为我节省几行代码。

    Qt不提供访问
    QNetworkAccessManager
    内部缓存的方法

    QNetworkReply
    api提供了一种相对简单的方式来监控回复的状态,但这确实需要用户自己管理回复,并记录请求的内容与收到的内容

    该信号是一个fire-and-forget API,不需要管理单个回复-但是,没有相应的全局信号在收到所有回复时通知用户

    Qt文档在回复对象的所有权方面有些误导:

    注意:请求完成后,由 用户可以在适当的时间删除
    QNetworkReply
    对象

    这给人的印象是Qt不维护回复的所有权,但事实上,
    QNetworkAccessManager
    使自己成为其所有repiles的父级,因此情况并非如此

    鉴于所有回复都将其管理器作为父级,PyQt中有一个相对简单的解决方案可用于检查所有当前回复的状态。连接到管理器的
    finished()
    信号的插槽可能包含如下代码:

    def handle_finished(self, reply):
        data = reply.readAll()
        # do something with data...
        reply.deleteLater()
        if all(child.isFinished() for child in
               reply.manager().findChildren(QtNetwork.QNetworkReply)):
            print('all finished')