我也应该连接到 QNetworkReply::error() 吗?

Posted

技术标签:

【中文标题】我也应该连接到 QNetworkReply::error() 吗?【英文标题】:Should I connect to QNetworkReply::error() as well? 【发布时间】:2013-08-23 13:46:34 【问题描述】:

我创建了一个 POST 请求并连接到finished() 信号:

QNetworkReply *reply = manager->post(request, postData.encodedQuery());
connect(reply, SIGNAL(finished()), this, SLOT(accept()));

我希望在 POST 请求完成时收到通知,无论它是失败还是成功。

我在文档中注意到还有一个QNetworkReply::error() 信号,我是否也需要连接到它,还是在所有情况下都会调用finished()

【问题讨论】:

【参考方案1】:

Qt 文档说明:

void QNetworkReply::error(QNetworkReply::NetworkError 代码) [信号]

当回复检测到处理错误时发出此信号。 finished() 信号可能会跟随,表明 连接结束。

根据我在 Qt 源代码中看到的内容(最近检查了完全相同的问题),在 error() 之后的任何地方,之后都有一个 finished() 调用。在 5.1.0 中我还没有找到一个地方,错误后面没有finished()

例如

void QNetworkReplyImpl::close()

    Q_D(QNetworkReplyImpl);
    if (d->state == QNetworkReplyImplPrivate::Aborted ||
        d->state == QNetworkReplyImplPrivate::Finished)
        return;

    // stop the download
    if (d->backend)
        d->backend->closeDownstreamChannel();
    if (d->copyDevice)
        disconnect(d->copyDevice, 0, this, 0);

    QNetworkReply::close();

    // call finished which will emit signals
    d->error(OperationCanceledError, tr("Operation canceled"));
    d->finished();

【讨论】:

【参考方案2】:

error() 的文档说,“finished() 信号可能会跟随”,所以不,finished() 应该就足够了。不过,不要忘记检查信号处理程序中的 error() getter。

【讨论】:

我主要想知道“可能”部分。这很模棱两可。他们并没有说这是肯定的。 没错,这有点可疑。在你的位置,我将开始阅读 Qt 源代码以了解在哪里触发 error() 并找出这是否会阻止 finished() 也被触发。如果你有源代码,那就太好了,而且 Qt 比我所知道的大多数东西都更具可读性。

以上是关于我也应该连接到 QNetworkReply::error() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

尝试连接到MySQL服务器:建立与SQL Server的连接时发生与网络相关或特定于实例的错误

关闭连接到 Mojo websocket 的 Mojo::IOLoop 重复事件

通过 *** 将 PHP 应用程序连接到 MSSQL 时应该考虑啥?

创建一个连接到数据库的会员应用程序,我应该学习啥?

完成后将 QRunnable 连接到函数/方法

将 Java 连接到 PhpMyAdmin 演示服务器?