Qt开发——文件下载软件

效果图

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还没解决。。。。应该是请求的时候有问题,先放这。。

发布了247 篇原创文章 · 获赞 254 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104095222
今日推荐