其实就QNetworkAccessManager一个可以解决的事情,默认是异步的,通过get获取QNetworkReply *reply包后进行信号的关联,关联finish,readyread, progress等信号处理收到的reply以及进行文件的多段存以及进度的显示。
reply = manager->get(QNetworkRequest(url));
//下面关联信号和槽
connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));
//下载完成后
connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
//有可用数据时
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
this,SLOT(updateDataReadProgress(qint64,qint64)));
//更新进度条
void Widget::httpReadyRead() //有可用数据
{
if (file) file->write(reply->readAll()); //如果文件存在,则写入文件
}
void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes); //最大值
ui->progressBar->setValue(bytesRead); //当前值
}
处理完之后记得deletelate调用。
然后实现同步的话可以加一个计时器然后进行QEventLoop的exec(),然后利用计时器超时或者reply的信号来exit这个loop然后其他都是一样的,实现阻塞而已