有什么方法可以获取有关 QNetworkAccessManager 队列的信息吗?
Is there some way to get information about the QNetworkAccessManager queue?
来自Qt 4 docs:
Note: QNetworkAccessManager
queues the requests it receives.
现在,我希望能够做两件事(使用 PyQt):
- 检查
QNetworkAccessManager
的 "internal" 队列中有多少请求等待发送。
- 检查有多少请求收到了答复(即计算完成的 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
APIs 提供了一种相对简单的方法来监视回复的状态,但这确实需要用户自己管理回复并记录所请求的内容vs收到了什么。
QNetworkAccessManager.finished()
信号是即发即弃 API,不需要管理单个回复 - 但是,没有相应的全局信号通知用户 所有 回复已收到。
Qt 文档在回复对象的所有权方面有些误导:
Note: After the request has finished, it is the responsibility of the
user to delete the QNetworkReply
object at an appropriate time.
这给人的印象是 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')
来自Qt 4 docs:
Note:
QNetworkAccessManager
queues the requests it receives.
现在,我希望能够做两件事(使用 PyQt):
- 检查
QNetworkAccessManager
的 "internal" 队列中有多少请求等待发送。 - 检查有多少请求收到了答复(即计算完成的 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
APIs 提供了一种相对简单的方法来监视回复的状态,但这确实需要用户自己管理回复并记录所请求的内容vs收到了什么。
QNetworkAccessManager.finished()
信号是即发即弃 API,不需要管理单个回复 - 但是,没有相应的全局信号通知用户 所有 回复已收到。
Qt 文档在回复对象的所有权方面有些误导:
Note: After the request has finished, it is the responsibility of the user to delete the
QNetworkReply
object at an appropriate time.
这给人的印象是 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')