2017-08-31 148 views
1

Qt 4 docs有没有办法获得有关QNetworkAccessManager队列的信息?

注: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_() 

在这种情况下是这样的allFinished来自经理的信号会为我节省几行代码。

+0

对我来说,这似乎像Qt来提供一个非常* *可能的API。 “QNetworkReply'实际上就是这个API”,只有当我做了一些额外的簿记。我知道这很容易实现,但如果信息必须在那里,为什么要这样做呢?这只会增加我的开销。如果经理管理一个队列,至少让我看看它有多长,或者例如提供类似'allFinished'的信号。 – Dennis

+0

假设我用一些请求发起了一些请求。 'manager.get(request)',而不明确地获取或保留对返回答复的引用。连接到'manager.finished'信号的插槽仍将获得相应的回复实例。这是否意味着经理已经保留了对答复的引用? – Dennis

+0

是的,在这种情况下,*就是我所说的。但是,如果Qt必须保持一个参考值,直到它向用户提交答复为止,这并不意味着它可以“平凡”地给我一个等待答复的数量的计数完成?这就是我所要求的。顺便说一句,谢谢你的善意帮助。 – Dennis

回答

1

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

QNetworkReply API提供一个相对简单的方式来监控回复的状态,但也不需要用户来管理的答复自我,不断的什么已经要求VS什么已经收到了提示。

QNetworkAccessManager.finished()信号是不需要个别答复的管理发射后不管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') 
相关问题