效果图
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
//https://dldir1.qq.com
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle(QStringLiteral("文本下载器"));
setWindowIcon(QIcon("icon.png"));
ui->progressBar->hide();//开始时将进度条隐藏
manager = new QNetworkAccessManager(this);//发送网络请求和接受应答
//当网络应答结束响应信号
connect(manager,SIGNAL(finished(QNetworkReply*)),this,
SLOT(replyFinished(QNetworkReply*)));
//发送网络请求
manager->get(QNetworkRequest(QUrl("http://www.baidu.com")));
}
MainWindow::~MainWindow()
{
delete ui;
}
//网络请求函数
void MainWindow::startRequest(QUrl url){
reply = manager->get(QNetworkRequest(url));
//当有新数据可读时发送信号
connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
//将下载进度条更新
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,
SLOT(updateDataReadProgress(qint64,qint64)));
//应答结束时发送完成信号
connect(reply,SIGNAL(finished()),this,SLOT(httpReadyRead()));
}
//读取内容信号
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();//完成下载时隐藏进度条
file->flush();//将所有缓存数据刷新
file->close();//关闭文件
reply->deleteLater();//计划删除对象
reply = nullptr;
delete file;//删除对象
file = nullptr;
}
//按下下载按键后的槽函数
void MainWindow::on_pushButton_clicked(){
url = ui->lineEdit->text();
QFileInfo info(url.path());
QString fileName(info.fileName());
//下载失败后删除对象并退出
if(file->open(QIODevice::WriteOnly)){
qDebug()<<"file open error";
delete file;
return;
}
startRequest(url);
ui->progressBar->setValue(0);
ui->progressBar->show();
}
//应答信号,显示网络文字,无法显示动态脚本等其他网络特效与图片
void MainWindow::replyFinished(QNetworkReply *reply){
QString all = reply->readAll();
ui->textBrowser->setText(all);
//读取完成后删除对象
reply->deleteLater();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUrl>
#include <QtNetwork>
namespace Ui {
class MainWindow;
class QFile;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void startRequest(QUrl url);
private:
Ui::MainWindow *ui;
QNetworkReply *reply;
QUrl url;
QFile *file;
QNetworkAccessManager *manager;
private slots:
void httpFinished();
void httpReadyRead();
void updateDataReadProgress(qint64,qint64);
void on_pushButton_clicked();
void replyFinished(QNetworkReply*);
};
#endif // MAINWINDOW_H
有bug还没解决。。。。应该是请求的时候有问题,先放这。。