Qt:在QNetworkAccessManager中发送请求后连接信号[重复]
Posted
技术标签:
【中文标题】Qt:在QNetworkAccessManager中发送请求后连接信号[重复]【英文标题】:Qt: connect a signal after a request is sent in QNetworkAccessManager [duplicate] 【发布时间】:2015-03-31 14:18:57 【问题描述】:我正在检查一些使用 QNetworkAccessManager 的简单示例,我发现了这一点(假设该管理器是 QNetworkAccessManager:
QNetworkRequest request;
request.setUrl(QUrl("http://www.someserver.com"));
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(slotSslErrors(QList<QSslError>)));
据我了解,对 manager->get 的调用将发出一个 GET 请求。然而,处理该请求的答案的插槽仅在发送呼叫之后连接,这对我来说似乎没有意义。这是我的问题:
在请求完成后将槽连接到信号不是问题吗?是否会发生请求已完成并在连接发生之前发出信号,因此信号被错过并且从未被相应的插槽处理的情况?谢谢!
L.
更新:正如cyber_raj 所指出的,这个问题已经在这里得到了回答:Qt signal slot connection - QNetworkAccessManager
【问题讨论】:
【参考方案1】:没问题。 get 调用是异步的: http://doc.qt.io/qt-5/qnetworkaccessmanager.html#details
QNetworkAccessManager 将它收到的请求排队,每次运行 6 个异步任务。 因此,正如您所指出的那样,没有太大的错误空间。
但是如果你害怕你可以试试第一个例子,连接经理的信号:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
【讨论】:
您发布的页面内容为:“6 个请求在 http 中为一个主机/端口组合并行执行”。如果我理解正确,这意味着如果为同一主机/端口组合处理的请求少于 6 个,我的请求将立即执行,所以我认为问题仍然存在。以上是关于Qt:在QNetworkAccessManager中发送请求后连接信号[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Qt QNetworkAccessManager 中止身份验证
使用 QNetworkAccessManager 在 QT 中的 HTTP POST 请求