如何增加 QNetworkReply::downloadProgress 信号频率?

Posted

技术标签:

【中文标题】如何增加 QNetworkReply::downloadProgress 信号频率?【英文标题】:How to increase QNetworkReply::downloadProgress signal frequency? 【发布时间】:2017-04-04 10:09:27 【问题描述】:

我正在尝试将进度观察添加到 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 信号更频繁地出现?

附: libcurl进度回调日志:

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

【问题讨论】:

【参考方案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 的成员,据我所知,您无法更改返回的持续时间(以毫秒为单位)。 progressSignalIntervalQNetworkReplyPrivate 的静态常量成员,其值在qnetworkreply.cpp100 中定义:
const int QNetworkReplyPrivate::progressSignalInterval = 100;

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

【讨论】:

感谢这个有趣的想法,但我既没有时间也不想重新编译 Qt :( 所以我就写libcurl Qt-wrapper

以上是关于如何增加 QNetworkReply::downloadProgress 信号频率?的主要内容,如果未能解决你的问题,请参考以下文章

标签文本增加时如何以编程方式增加集合视图单元格高度?

如何增加 cookie 值?

如何增加特定端点的超时?

如何增加mfc中组合框控件的高度?

如何增加虚拟机ubuntu的硬盘

如何增加色彩空间CAGradientLayer