有没有办法获取有关 QNetworkAccessManager 队列的信息?

djv*_*jvg 5 queue qt pyqt pyside qnetworkaccessmanager

来自Qt 4 文档

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

现在,我希望能够做两件事(使用 PyQt):

  1. 检查“内部”队列中有多少请求QNetworkAccessManager等待发送。
  2. 检查有多少请求已收到答案(即计算已完成的 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_()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,诸如allFinished来自经理的信号之类的东西可以为我节省几行代码。

ekh*_*oro 4

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

APIQNetworkReply提供了一种相对简单的方法来监视回复状态,但这确实需要用户自己管理回复并记录已请求的内容已收到的内容。

QNetworkAccessManager.finished()信号是一个即发即忘的 API,不需要管理各个回复 - 但是,没有相应的全局信号可以在收到所有回复时通知用户。

Qt 文档对于回复对象的所有权有些误导:

注意:请求完成后,用户有责任QNetworkReply在适当的时间删除该对象。

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

鉴于所有回复都有其管理者作为父级,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')
Run Code Online (Sandbox Code Playgroud)