基于HTTP协议的网络应用程序

#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/");
}

 

 


posted @ 2021-09-09 16:51  Azuki_op  阅读(115)  评论(0)    收藏  举报