c++ - 连续中止后未触发 Qt 下载进度
问题描述
对于使用 Qt 5.3.2 的旧工具,我们最近遇到了一个问题。使用QNetwork
管理器我们正在下载文件,但在我们下载它们之前,我们会检查它们是否可以从某个区域下载。为此,我们在第一个进度指示处进行中止。
由于最近我们downloadProgress
在一些中止后不再收到信号,并且仅在非常快速的网络连接时才会发生。通过WiFi它不会复制。可能是什么问题呢?
一些代码片段:
开始下载:
networkManager->get(request);
networkReply->setReadBufferSize(4 * 1024 * 1024);
connect(networkReply, SIGNAL(finished()),
this, SLOT(onDownloadFinished()));
connect(networkReply, SIGNAL(downloadProgress(qint64, qint64)),
this, SLOT(onDownloadProgress()));
connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(onDownloadError(QNetworkReply::NetworkError)));
connect(networkReply, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(onDownloadSslErrors(QList<QSslError>)));
connect(networkReply, SIGNAL(encrypted()),
this, SLOT(onEncrypted()));
下载进度:
void DownloadManager::onDownloadProgress()
{
networkReply->abort();
nrAborts++;
startDownload(myurl);
}
下载完成:
void DownloadManager::onDownloadFinished()
{
networkReply->deleteLater();
}
解决方案
由于读取缓冲区在第一次之前已满,onDownloadProgress
并且从未被读取,因此所有内容都被卡住了。订阅readyRead
和读取数据networkReply->readAll()
会导致缓冲区被刷新并被downloadProgress
调用。
推荐阅读
- javascript - 如何在js中的循环每次迭代后更新窗口?
- r - 鉴于最新的 R 版本,无法安装软件包
- javascript - 如何在 Firebase 上添加子项,然后获取并显示信息?
- javascript - 如何通过单击使用循环动态创建的按钮来获取按钮的值
- android - 从 ViewHolder 类更新项目数据
- javascript - 求和嵌套值(如果存在)
- javascript - 如何为数组上的每个元素运行函数
- parsing - 阅读器宏与普通解析器
- c# - 使用 Azure 函数始终加密 - 尝试通过静态变量避免重复初始化
- rust - 是否有针对 Rc 或 Arc 的操作克隆基础值并将其返回给调用者?