#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUrl>
//类的前置声明,告诉编译器这是一个类允许编译通过
class QNetworkReply;
class QNetworkAccessManager;
class QFile;
class QLabel;
class QProgressBar;
class QPushButton;
class QLineEdit;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void startRequest(QUrl url);
private slots:
void httpFinished();
void httpReadyRead();
void updateDataReadProgress(qint64 bytes_read, qint64 total_bytes);
void onPushButtonClicked();
private:
QNetworkAccessManager* manager_;
QNetworkReply* reply_;
QUrl url_;
QFile* file_;
QLabel* hint_message_label_;
QLineEdit* input_message_lineedit_;
QProgressBar* progress_bar_;
QPushButton* download_button_;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QDebug>
#include <QtNetwork>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QProgressBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
resize(800,600);
hint_message_label_ = new QLabel(QString::fromLocal8Bit("请输入URL地址"),this);
hint_message_label_->setGeometry(100,100,200,32);
input_message_lineedit_ = new QLineEdit(this);
input_message_lineedit_->setGeometry(100,132,200,32);
progress_bar_ = new QProgressBar(this);
progress_bar_->setMinimum(0);//最大最小值
progress_bar_->setMaximum(100);
progress_bar_->setValue(0);//当前值
progress_bar_->setOrientation(Qt::Horizontal);//进度条水平放置
progress_bar_->setGeometry(100,174,230,32);
progress_bar_->hide();
download_button_ = new QPushButton(QString::fromLocal8Bit("下载"),this);
download_button_->setGeometry(300,132,32,32);
connect(download_button_, &QPushButton::clicked, this, &MainWindow::onPushButtonClicked);
manager_ = new QNetworkAccessManager(this);
}
MainWindow::~MainWindow()
{
}
void MainWindow::startRequest(QUrl url)
{
//发送网络请求
reply_ = manager_->get(QNetworkRequest(url_));
//readyRead信号继承自QIODevice类,每当有新的数据可以读取时,都会发射该信号
connect(reply_, &QNetworkReply::readyRead, this, &MainWindow::httpReadyRead);
//网络请求的下载进度更新时发射信号
connect(reply_, &QNetworkReply::downloadProgress, this, &MainWindow::updateDataReadProgress);
//应答处理结束时发射信号
connect(reply_, &QNetworkReply::finished, this, &MainWindow::httpFinished);
}
void MainWindow::httpFinished()
{
progress_bar_->hide();
if(file_){
file_->close();
delete file_;
file_ = 0;
}
reply_->deleteLater();
reply_ = 0;
}
void MainWindow::httpReadyRead()
{
if(file_){
file_->write(reply_->readAll());
}
}
void MainWindow::updateDataReadProgress(qint64 bytes_read, qint64 total_bytes)
{
progress_bar_->setMaximum(total_bytes);
progress_bar_->setValue(bytes_read);
}
void MainWindow::onPushButtonClicked()
{
url_ = input_message_lineedit_->text();
QFileInfo info(url_.path());
QString fileName(info.fileName());
if(fileName.isEmpty()){
fileName = "index.html";
}
file_ = new QFile(fileName);
if(!file_->open(QIODevice::WriteOnly)){
delete file_;
file_ = 0;
return;
}
startRequest(url_);
progress_bar_->setValue(0);
progress_bar_->show();
}