#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
#include <QUrl>
#include <QDir>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void onFinished(); //网络响应结束
void onReadyRead(); //读取下载的数据
void onDownloadProgress(qint64 bytesRea, qint64 totalBytes); //下载进程
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
QNetworkAccessManager* m_networkManager; //网络管理
QNetworkReply* m_reply = nullptr; //网络响应
QFile *m_file = nullptr; //下载保存的临时文件
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDir>
#include <QDesktopServices>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->progressBar->setValue(0);
m_networkManager = new QNetworkAccessManager(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//网络响应结束
void MainWindow::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->pushButton->setEnabled(true);
}
//读取下载的数据
void MainWindow::onReadyRead()
{
m_file->write(m_reply->readAll()); //将返回的数据进行读取,写入到临时文件中
}
//下载进程
void MainWindow::onDownloadProgress(qint64 bytesRea, qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRea);
}
void MainWindow::on_pushButton_clicked()
{
QString urlSpec = ui->lineEdit->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->lineEdit_2->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->pushButton->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 MainWindow::on_pushButton_2_clicked()
{
QString currPath = QDir::currentPath();
QDir dir(currPath);
dir.mkdir("temp");
ui->lineEdit_2->setText(currPath + "/temp/");
}
![]()