QtExamples/QtHttpEx/ExHttp.cpp
touwoyimuli f4cda11752 feat: QNetworkAccessmanager and QNetworkReply and QNetworkRequest
提供网络协议的7层模型中的 中高层的网络协议:Http/FTP/SNMP等  ==>

QNetworkAccessmanager  协调网络操作类(处理网络的请求和回应):负责发送网络请求,创建网络响应
QNetworkRequest        网络请求
QNetworkReply          网络请求的响应(提供finished()/readyRead()/downloadProgress()信号),监测网络响应的执行情况,执行相应的操作
2019-12-09 00:09:36 +08:00

110 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ExHttp.h"
#include "ui_ExHttp.h"
#include <QMessageBox>
#include <QDir>
#include <QDesktopServices>
ExHttp::ExHttp(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ExHttp)
{
ui->setupUi(this);
setWindowTitle("QNetworkAccessManager 网络管理使用 Http 协议下载");
m_networkManager = new QNetworkAccessManager(this);
m_reply = nullptr;
m_file = nullptr;
}
ExHttp::~ExHttp()
{
delete ui;
}
//下载文件
void ExHttp::on_btnDown_clicked()
{
QString urlSpec = ui->lineEditUrl->text().trimmed(); //去掉字符串的首尾的空格
if (urlSpec.isEmpty()) {
QMessageBox::information(this, "提示", "下载地址URL为NULL");
return;
}
QUrl url = QUrl::fromUserInput(urlSpec);
if (!url.isValid()) {
QMessageBox::information(this, "提示", QString("无效URL: %1 \n 错误信息: %2").arg(urlSpec, url.errorString()));
return;
}
QString dir = ui->lineEditFile->text().trimmed();
if (dir.isEmpty()) {
QMessageBox::information(this, "提示", "保存地址为空");
return;
}
QString fileFileName = dir + url.fileName(); //文件保存地址 + 文件名
if (QFile::exists(fileFileName))
QFile::remove(fileFileName);
m_file = new QFile(fileFileName); //创建临时文件
if (!m_file->open(QIODevice::WriteOnly)) {
QMessageBox::information(this, "提示", "打开临时文件错误");
return;
}
ui->btnDown->setEnabled(false);
m_reply = m_networkManager->get(QNetworkRequest(url)); //发送get网络请求创建网络响应
connect(m_reply, SIGNAL(finished()), this, SLOT(onFinished()));
connect(m_reply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
connect(m_reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(onDownloadProgress(qint64,qint64)));
}
//默认的保存路径
void ExHttp::on_btnFile_clicked()
{
QString currPath = QDir::currentPath();
QDir dir(currPath);
dir.mkdir("temp");
ui->lineEditFile->setText(currPath + "/temp/");
}
//网络响应结束
void ExHttp::onFinished()
{
QFileInfo fileInfo;
fileInfo.setFile(m_file->fileName());
m_file->close();
delete m_file;
m_file = nullptr;
m_reply->deleteLater();
m_reply = nullptr;
if (ui->checkBox->isChecked()) //勾选了,下载完成之后,打开下载的文件 //absoluteFilePath() 返回包含文件名的绝对路径。
QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath())); //使用默认软件的打开下载的文件
ui->btnDown->setEnabled(true);
}
//读取下载的数据
void ExHttp::onReadyRead()
{
m_file->write(m_reply->readAll()); //将返回的数据进行读取,写入到临时文件中
}
//下载进程
void ExHttp::onDownloadProgress(qint64 bytesRea, qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRea);
}
void ExHttp::on_lineEditUrl_textChanged(const QString &arg1)
{
ui->progressBar->setMaximum(100);
ui->progressBar->setValue(0);
}