QNetworkReply 未发出 downloadProgress

Posted

技术标签:

【中文标题】QNetworkReply 未发出 downloadProgress【英文标题】:downloadProgress not emitted from QNetworkReply 【发布时间】:2009-07-28 19:27:16 【问题描述】:

我正在尝试使用QNetworkAccessManager 构建一个在Qt 中下载二进制文件的模块。我使用文档中详述的相同方法(见下文),但虽然我确实收到了 readyRead 信号,但 downloadProgress 永远不会到达。

一切都发生在同一个线程上(项目很大,所以我不能全部粘贴)。

有什么想法吗?

QNetworkRequest request;
request.setUrl("http://XXX.s3.amazonaws.com/XXX.exe");
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

QNetworkAccessManager * m_manager = new QNetworkAccessManager( this );
m_reply = m_manager->get(request);
m_reply->setParent(this);

connect(m_reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(m_reply, SIGNAL(downloadProgress(qint64 bytesReceived, qint64 bytesTotal)),
this, SLOT(replyDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)));

【问题讨论】:

你真的在readyRead上读过东西吗?发布的代码中没有任何下载... 是的,我确实读过,只是没有将其粘贴到此处。使用来自 qt 代码的浏览器示例 【参考方案1】:

好的,找到了 哇,多么简单的错误。

答案是句法:

connect(m_reply, SIGNAL(downloadProgress(qint64 bytesReceived, qint64 bytesTotal)),
        this, SLOT(replyDownloadProgress(qint64 bytesReceived, qint64 bytesTotal))); 

是一个错误

应该是:

connect(m_reply, SIGNAL(downloadProgress(qint64 , qint64 )),
        this, SLOT(replyDownloadProgress(qint64 , qint64 )); 

一旦我改变它,我就会收到信号。

QT 不检查其预处理器中的语法错误(自我说明)

【讨论】:

是的。但是这些错误很容易被忽略(如果你自己输出任何东西) Kitsune:我可以在 Visual Studio 上看到 stderr 吗?那会在输出窗口中吗 是的,看看输出窗口。【参考方案2】:

我已经修补了我的 Qt 以使用 qFatal() 而不是 qWarning(),因此应用程序断言而不是打印错误消息(在链接到发布构建 Qt 时无法看到)。 YMMV。

【讨论】:

以上是关于QNetworkReply 未发出 downloadProgress的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 发出请求后QNetworkReply为空[重复]

从 QNetworkReply 读取未解码的数据

连接丢失时未检测到 QNetworkReply 错误信号

QNetworkReply 未被删除

QNetworkReply::error 信号何时会跟随finished() 信号?

QNetworkReply 不会在 HTML 注释中隐藏 JavaScript