#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QMessageBox>
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle(QStringLiteral("HTTP下载工具"));
ui->mainToolBar->hide();
m_pReply = nullptr;
m_bytesTotal = 0;
m_pManager = new QNetworkAccessManager(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(saveAsFile()));
}
MainWindow::~MainWindow()
{
if (m_pReply && m_pReply->isOpen()) {
disconnect(m_pReply, SIGNAL(finished()), this, SLOT(onFinished()));
m_pReply->close();
}
if (m_file.isOpen()) {
m_file.close();
}
delete ui;
}
void MainWindow::saveAsFile()
{
m_url.setUrl(ui->lineEdit->text());
if (!m_url.isValid()) {
QMessageBox::critical(this, QStringLiteral("错误"), QStringLiteral("文件路径错误!"));
return;
}
QFileInfo info(ui->lineEdit->text());
QString fileName = QFileDialog::getSaveFileName(this, QStringLiteral("保存到"), ui->lineEdit->text(), info.suffix());
if (fileName.isEmpty()) {
return;
}
m_file.setFileName(fileName);
if (!m_file.open(QIODevice::WriteOnly)) {
QMessageBox::critical(this, QStringLiteral("错误"), QStringLiteral("本地文件创建失败!"));
return;
}
ui->progressBar->setValue(0);
downLoad();
ui->pushButton->setEnabled(false);
ui->lineEdit->setEnabled(false);
}
void MainWindow::readData()
{
m_file.write(m_pReply->readAll());
}
void MainWindow::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
ui->progressBar->setMaximum(bytesTotal);
ui->progressBar->setValue(bytesReceived);
m_bytesTotal = bytesTotal;
double total = (double)bytesTotal / (1024 * 1024);
double bytes = (double)bytesReceived / (1024 * 1024);
double speed = bytes / (m_time.elapsed() / 1000);
ui->statusBar->showMessage(QStringLiteral("总大小:%2MB - 已下载 %1MB - 速度: %3 MB/s").arg(bytes).arg(total).arg(speed));
}
void MainWindow::onFinished()
{
m_file.flush();
m_file.close();
m_pReply->deleteLater();
m_pReply = nullptr;
ui->pushButton->setEnabled(true);
ui->lineEdit->setEnabled(true);
double total = (double)m_bytesTotal / (1024 * 1024);
ui->statusBar->showMessage(QStringLiteral("总大小:%2MB - 已下载 %1MB - 速度: %3 MB/s").arg(total).arg(total).arg(0));
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("下载完成!"));
}
void MainWindow::downLoad()
{
m_pReply = m_pManager->get(QNetworkRequest(m_url));
connect(m_pReply, SIGNAL(readyRead()), this, SLOT(readData()));
connect(m_pReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(onDownloadProgress(qint64, qint64)));
connect(m_pReply, SIGNAL(finished()), this, SLOT(onFinished()));
m_time.start();
}
qt5-HTTP下载工具-QNetworkAccessManager
4星 · 超过85%的资源 需积分: 50 83 浏览量
2017-11-03
17:59:58
上传
评论 1
收藏 5KB RAR 举报
小祥啰啰嗦
- 粉丝: 12
- 资源: 48
最新资源
- measuring-performance.zip
- 基于Qt+C++实现的各种曲线+源码
- STC15系列库(带使用手册)
- 基于matlab车辆路径问题使用矩阵蚂蚁算法 车辆调度问题
- 较全的好几种调制解调方案的matlab代码,有ASK,BPSK,FSK,QAM等的源代码 对通信领域的研究人员很有帮助
- Python毕业设计-基于django的毕业设计管理系统(源码+数据库).zip
- Python毕业设计-基于django的毕业设计管理系统(源码+数据库).zip
- 用Pygame zero (pgzero)开发游戏(带例子)
- apache-tomcat-9.0.88.zip
- 基于Qt+C++实现的各种炫酷的样式表+源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈