有啥方法可以获取有关 QNetworkAccessManager 队列的信息吗?

Posted

技术标签:

【中文标题】有啥方法可以获取有关 QNetworkAccessManager 队列的信息吗?【英文标题】:Is there some way to get information about the QNetworkAccessManager queue?有什么方法可以获取有关 QNetworkAccessManager 队列的信息吗? 【发布时间】:2017-08-31 18:32:02 【问题描述】:

来自Qt 4 docs:

注意: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 信号可以为我节省几行代码。

【问题讨论】:

【参考方案1】:

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

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

QNetworkAccessManager.finished() 信号是一种即发即弃 API,不需要管理单个回复 - 但是,当 所有 回复有已收到。

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

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

这给人的印象是 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')

【讨论】:

以上是关于有啥方法可以获取有关 QNetworkAccessManager 队列的信息吗?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以获取 PostgreSQL 中第一个、第二个、第三个表的名称?

Qt、QNetworkAccess Manager下载大文件频繁失败

有啥方法可以使用 HttpUrlConnection 正确获取上传进度

TextArea - 有啥方法可以获取所有文本?

Apache Tomcat MimeTypes - 有啥方法可以获取它们?

有啥方法可以通过 selenium 获取元素的类名