顺序中止后未触发 Qt 下载进度
Qt download progress not being triggered after sequential aborts
对于使用 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
信号。
对于使用 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
信号。