写点什么

Qt|使用 Http 通讯下载页面实时显示

  • 2022 年 7 月 19 日
  • 本文字数:1214 字

    阅读完需:约 4 分钟

Qt|使用Http通讯下载页面实时显示

上一章节中介绍了如何使用 HTTP 通讯下载 url 文件信息。

如果网络理想情况下,会很快下载成功,或者是文件比较小,也会很快下载成功的。

但是,当网络不通畅的时候?下载文件过大时候?会造成页面卡顿,给使用者呈现出一种程序未响应状态。

针对上述极有可能出现的问题,今天来讲解下如何在页面中实时查看下载进度。

下载实时显示

在下载 url 时,我们可以提前获取到文件的总长度,以及每次实时下载的长度。根据这两点,就可以实现在页面上实时显示的效果了。

一般在界面上会采用进度条控件实时显示下载进度

1:发送文件总长度

当接收到 http 返回的文件总长度时,及时通知到页面。

也就是在"WinHttpQueryHeaders"函数后面,发送槽函数,通知窗口,假设,我们定义为:

Msg_SendFilesTotalLens(int dwTotalSize);

2:发送实时下载长度

在"WinHttpQueryDataAvailable"的 while 循环中,会每次获取 4096 个长度,那么我们需要发送实时获取的长度。

在这里,需要注意的是,发送的数据一定是追加之后的数据,而不是每次下载的数据。

DWORD  dwSize, dwWrite, dwCalcSize = 0;while (WinHttpQueryDataAvailable(hRequest, &dwSize) && dwSize){  if (dwSize > 4096)  {    dwSize = 4096;  }  //发送实时文件长度  dwCalcSize += dwSize;  emit Msg_SendFilesCurrentLens(dwCalcSize);
ZeroMemory(pBuffer, 4096); WinHttpReadData(hRequest, pBuffer, dwSize, &dwSize); WriteFile(hFile, pBuffer, dwSize, &dwWrite, NULL);}
复制代码


发送的槽函数是:Msg_SendFilesCurrentLens(int dwCurrentSize);

3:界面接收文件总长度信息

下载 http 的类定义了发送消息之后,我们就需要在显示页面上接收并显示接收的内容

槽函数连接

connect(m_pHttp, &QDownLoad::Msg_SendFilesTotalLens, this,&QMywidget::MsgReceivedTotalLens);
复制代码


响应函数实现

QMyWidget::MegReceivedTotalLens(int dwTotalSize){   //第一步:将进度条重新回到开始   ui.progressBar->reset();   //第二步:设置范围值   ui.progressBar->setMinimum(0);   ui.progressBar->setMaximum(dwTotalSize);}
复制代码

4:界面接收实时下载文件长度

当前功能比较简单,只是实时更新进度条的进度值就可以了


ui.progressBar->setValue(dwCurrentLens);
复制代码

防止页面假死

上述功能完成的是如何在页面上显示。

一般情况下,我们在做下载操作时,会放到线程里进行实现的。为了实现可以在下载的同时又操作其他显示页面。做到了互不干扰。

针对这样的功能,我们需要采用 QT 中一个比较方便的开线程方式:QtConcurrent::run

QFuture<bool> future = QtConcurrent::run(this, &EachEvaluationWidget::ThreadDownLoadFiles);while (!future.isFinished()){   QApplication::processEvents(QEventLoop::AllEvents, 100);}
复制代码


具体的详细使用规则不再过多说明了,之前就有更新过,如果有不了解的,可以去查看哦~

使用 HTTP 通讯下载的同时实时进行页面展示的功能就更新到这里啦~


我是中国好公民 st,一名 C++开发程序媛~

发布于: 刚刚阅读数: 5
用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
Qt|使用Http通讯下载页面实时显示_qt_中国好公民st_InfoQ写作社区