实现功能:输入资源地址,点击下载,下载该文件,并显示下载进度。
代码如下:
myHttp2.pro
QT += network
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUrl>
namespace Ui {
class MainWindow;
}
class QFile;
class QNetworkReply;
class QNetworkAccessManager;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void startRequest(QUrl url);
private:
Ui::MainWindow *ui;
QNetworkAccessManager* manager;
QNetworkReply *reply;
QUrl url;
QFile *file;
private slots:
void httpFinished();
void httpReadyRead();
void updateDataReadProgress(qint64,qint64);
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QFile>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
manager = new QNetworkAccessManager(this);
ui->progressBar->hide();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startRequest(QUrl url)
{
reply = manager->get(QNetworkRequest(url));
connect(reply,&QNetworkReply::readyRead,this,&MainWindow::httpReadyRead);
connect(reply,&QNetworkReply::downloadProgress,this,&MainWindow::updateDataReadProgress);
connect(reply,&QNetworkReply::finished,this,&MainWindow::httpFinished);
}
void MainWindow::httpReadyRead()
{
if (file) {
file->write(reply->readAll());
}
}
void MainWindow::updateDataReadProgress(qint64 bytesRead,qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRead);
}
void MainWindow::httpFinished()
{
ui->progressBar->hide();
if (file) {
file->close();
delete file;
file = nullptr;
}
reply->deleteLater();
reply = 0;
}
void MainWindow::on_pushButton_clicked()
{
url = ui->lineEdit->text();
QFileInfo info(url.path());
QString fileName(info.fileName());
qDebug()<<fileName;
if (fileName.isEmpty()) {
fileName = "index.html";
}
file = new QFile(fileName);
if (!file->open(QIODevice::WriteOnly)) {
delete file;
file = 0;
return;
}
startRequest(url);
ui->progressBar->setValue(0);
ui->progressBar->show();
}
这里使用了get()函数来发送网络请求,然后进行了 QNetworkReply对象的几个信号和自定义槽的关联。其中readyRead()信号继承自QIODevice类,每当有新的数据可以读取时,都会发射该信号;每当网络请求的下载进度更新时都会发射download-progress()信号,用来更新进度条;每当应答处理结束时都会发射finished()信号,该信号与前面程序中QNetworAccessManager类的finished()信号作用相同,只不过发送者不同,参数也不同而已。