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可靠连接

Qt同步QNetworkAccessManager获取

Qt QNetworkAccessManager 中止身份验证

使用 QNetworkAccessManager 在 QT 中的 HTTP POST 请求

当 QNetworkAccessManager 完成时,Qt 检索在请求期间创建的附加数据

如何使用 Qt/QNetworkAccessManager (C++) 实现 SFTP