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

发布于:2022-11-28 ⋅ 阅读:(419) ⋅ 点赞:(0)

上一章节中介绍了如何使用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通讯下载的同时实时进行页面展示的功能就更新到这里啦~

我是糯诺诺米团,一名C++开发程序媛~

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到