0

我正在尝试将进度观察添加到 Qt 的FileDownloader示例中。
它有效,但不是我想要的方式 -downloadProgress信号太罕见了!
约 300 Kb 文件只需两次。

这使得无法在 GUI 中流畅地显示下载进度。

编码:

...
QNetworkReply* reply = m_WebCtrl.get(request);
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(onDownloadProgress(qint64,qint64)));

void FileDownloader::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) 
{
    qDebug() << "Download progress:" << bytesReceived << bytesTotal;
}

输出:

Download progress: 19954 from -1 Download progress: 288322 from -1 Download progress: 288322 from 288322

有没有办法让downloadProgress信号来得更频繁?

PSlibcurl进度回调日志:

Download progress: 2753 of 0 Download progress: 4141 of 0 Download progress: 5995 of 0 Download progress: 7383 of 0 ...

4

1 回答 1

1

TL;DR最简单的方法是重新编译 Qt 并更改以下行:

// in qtbase/src/network/access/qnetworkreply.cpp
const int QNetworkReplyPrivate::progressSignalInterval = 100;

...具有小于 100 的值(以毫秒为单位)。


如果您查看QNetworkReply(和相关类)的 Qt 源代码,您会发现以下内容:

if (downloadProgressSignalChoke.elapsed() >= progressSignalInterval) {
    downloadProgressSignalChoke.restart();
    emit q->downloadProgress(bytesDownloaded,
                         totalSize.isNull() ? Q_INT64_C(-1) : totalSize.toLongLong());
}

所以你可以看到控制信号发射的是downloadProgressSignalChokeprogressSignalInterval

  • downloadProgressSignalChokeQElapsedTimer私有 Qt 类的成员QNetworkReplyPrivate,据我所知,您无法更改返回的持续时间(以毫秒为单位)。
  • progressSignalInterval是一个静态常量成员,QNetworkReplyPrivate其值在qnetworkreply.cppto中定义100
const int QNetworkReplyPrivate::progressSignalInterval = 100;

这意味着刷新间隔(显然)设置为恒定的 100 毫秒。

于 2017-04-04T12:15:39.187 回答