0

我正在尝试添加对Qt的FileDownloader示例的观察。
它的工作原理,但没有像我想要的那样 - downloadProgress信号称为太稀罕了!
只有两次〜300 Kb文件。
如何增加QNetworkReply :: downloadProgress信号频率?

这使其无法在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信号来得更加频繁?

P.S. 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.


如果你看Qt源代码为QNetworkReply(和relat编班),你会发现以下内容:

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

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

  • downloadProgressSignalChokeQElapsedTimerQNetworkReplyPrivate私人的Qt类的成员,而且据我所知,你不能改变的时间返回(这是毫秒)。
  • progressSignalIntervalQNetworkReplyPrivate静态恒定构件,其值在qnetworkreply.cpp定义100
const int QNetworkReplyPrivate::progressSignalInterval = 100; 

这意味着该刷新间隔为(明显地)设定为常数100毫秒。

+0

感谢这样有趣的想法,但我既没有时间也没有渴望重新编译Qt :( 所以我只写'libcurl' Qt-wrapper – eraxillan