QT-基于HTTP的网络应用程序

Qt网络模块提供的一些类实现了OSI七层协议网络模型中高层的网络协议,如HTTP、FTP、SNMP等,这些类主要是QNetworkRequest、QNetworkReply和QNetworkAccessManager。
今天这个程序的运行如下:
在这里插入图片描述
其中mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
#include <QMessageBox>
#include <QDir>
#include <QDesktopServices>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    //网络管理 协调网络工作在Qnetworkrequest发起一个网络请求后,它负责发送网络请求 创建网络响应
    QNetworkAccessManager networkManager;
    //表示网络请求的响应,它提供finished readyRead downloadPorgress信号监测网络响应的执行的情况
    //因为它是QIODevice的子类,所以它支持流的读写功能以及异步或者同步的工作模式
    QNetworkReply *reply;
    //下载保存的临时文件
    QFile *downloadFile;
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_finished();
    void on_readRead();
    void on_downloadProgress(qint64 bytesRead,qint64 totalBytes);
    void on_btn_download_clicked();
    
    void on_btn_default_clicked();
    
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}
//网络响应结束
//关闭临时文件 删除文件变量和网络响应变量
void MainWindow::on_finished()
{
    QFileInfo fileInfo;
    fileInfo.setFile(downloadFile->fileName());
    downloadFile->close();
    delete downloadFile;
    //这个Q_NULLPR就是一个宏支持C++11 为nullptr 不支持为NULL
    downloadFile=Q_NULLPTR;
    reply->deleteLater();
    reply=Q_NULLPTR;
    if(ui->radioButton->isChecked()){
        //调用缺省的应用软件打开下载的文件
        QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));
    }
    ui->btn_download->setEnabled(true);
    
}
//读取下载的缓冲区的数据到临时文件
void MainWindow::on_readRead()
{
    downloadFile->write(reply->readAll());
    
}
//下载进程 已读取的字节数和总的字节数
void MainWindow::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(bytesRead);
    
}
//按钮下载
void MainWindow::on_btn_download_clicked()
{
    //trimmed会去除首尾的空白字符串但是中间的空格不会去除 simplified()也会去除首尾的空格但是中间的空格会去除剩一个
    QString urlSpec=ui->lineEdit_Url->text().trimmed();
    if(urlSpec.isEmpty()){
        QMessageBox::information(this,"错误","请指定下载位置");
        return;
    }
    //根据用户输入的字符串转换为合法的URL地址
    QUrl newUrl=QUrl::fromUserInput(urlSpec);
    if(!newUrl.isValid()){
        QMessageBox::information(this,"错误",QString("无效URL: %1 \n 错误信息: %2")
                                 .arg(urlSpec,newUrl.errorString()));
        return;
    }
    //获取指定的临时目录
    QString tempDir=ui->lineEdit_2->text().trimmed();
    if(tempDir.isEmpty()){
        QMessageBox::information(this,"错误","请指定下载文件的目录");
        return;
    }
    //临时文件名
    QString fullFileName=tempDir+newUrl.fileName();
    if(QFile::exists(fullFileName))
        QFile::remove(fullFileName);
    //创建临时文件
    downloadFile=new QFile(fullFileName);
    if(!downloadFile->open(QIODevice::WriteOnly)){
        QMessageBox::information(this,"错误","临时文件打开错误");
        return;
    }
    ui->btn_download->setEnabled(false);
    //QNetworkRequest是通过一个url地址发起网络请求,也保存网络请求的消息,目前支持HTTP FTP和局部文件URLs的上传
    reply=networkManager.get(QNetworkRequest(newUrl));
    connect(reply,SIGNAL(finished()),this,SLOT(on_finished()));
    connect(reply,SIGNAL(readyRead()),this,SLOT(on_readRead()));
    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(on_downloadProgress(qint64,qint64)));
}
//按钮 缺省路径就是在当前目录下创建一个临时文件夹
void MainWindow::on_btn_default_clicked()
{
    QString curPath=QDir::currentPath();
    QDir dir(curPath);
    QString sub="temp";
    dir.mkdir(sub);
    ui->lineEdit_2->setText(curPath+"/"+sub+"/");
}

mainwindow.ui:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值