QT学习笔记—网络编程(HTTP)

要使用Qt Network模块中的类,要在工程文件中加入以下一行代码:

QT += network

处理网络请求的类: QNetworkRequest

协调网络操作、调度创建好的请求,发射信号报告进度 :QNetworkAccessManager

网络请求应答: QNetworkReply

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
          this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

HTTP

http通信实例: 实现一个简单HTTP文件下载小工具

在这里插入图片描述

使用到的QNetworkReply信号:

[signal] void QIODevice::readyRead()  //读就绪,继承自QIODevice类
signal] void QNetworkReply::finished()   //完成
[signal] void QNetworkReply::downloadProgress(qint64 bytesReceived, 
                                              qint64 bytesTotal) 
 //下载进度

实例

1、创建工程,添加一些私有变量和槽

class HttpDownload : public QMainWindow
{
    
    
    Q_OBJECT

public:
    explicit HttpDownload(QWidget *parent = 0);
    ~HttpDownload();
   //添加以下槽
    void startDownload(void);
    void httpReadyRead(void);
    void updateDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
    void httpDownloadFinish(void);

private:
    Ui::HttpDownload *ui;
   //添加以下私有变量
    QUrl url;     //URL
    QFile *file;  //文件
    QNetworkAccessManager *networkManager;  //网络管理
    QNetworkReply *netReply;  //应答
};

2、构造函数初始化

HttpDownload::HttpDownload(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::HttpDownload)
{
    
    
    ui->setupUi(this);
    ui->progressBar->setValue(0);
    networkManager = new QNetworkAccessManager;
    connect(ui->pushButton, &QPushButton::clicked, this, &HttpDownload::startDownload);  
}

3、实现startDownload

void HttpDownload::startDownload()
{
    
    
    url = ui->lineEdit->text();            //获取下载地址
    qDebug() << url.path();
    QFileInfo fileInfo(url.path());        //获取文件信息
    QString fileName(fileInfo.fileName()); //获取文件名
    qDebug() << fileName;
    if (fileName.isEmpty())
    {
    
    
        fileName = "index.html";
    }
    file = new QFile(fileName);
    if (!file->open(QIODevice::WriteOnly))  //打开文件
    {
    
    
        delete file;
        file = 0;
        return;
    }

    netReply = networkManager->get(QNetworkRequest((url)));   //开始网络请求

    ui->progressBar->setValue(0);    //设置进度条的进度为0
    //链接到QNetworkReply提供的信号
    connect(this->netReply, &QNetworkReply::readyRead, this, &HttpDownload::httpReadyRead);  
    connect(this->netReply, &QNetworkReply::downloadProgress, this, &HttpDownload::updateDownloadProgress);
    connect(this->netReply, &QNetworkReply::finished, this, &HttpDownload::httpDownloadFinish);
}

4、实现httpReadyRead

扫描二维码关注公众号,回复: 11654825 查看本文章
void HttpDownload::httpReadyRead()
{
    
    
    if (file)
    {
    
    
        file->write(netReply->readAll());  //将读取得所有数据写入文件
    }
}

5、实现更新进度条的updateDownloadProgress

void HttpDownload::updateDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
    
    
    ui->progressBar->setValue(bytesReceived);    //更新进度条
    ui->progressBar->setMaximum(bytesTotal);
}

6、对下载完成后做处理httpDownloadFinish

void HttpDownload::httpDownloadFinish()
{
    
    
    ui->progressBar->setValue(0);                //下载结束,设置进度条为0
    if (file)
    {
    
    
        file->close();     //关闭文件
        delete file;       //释放分配的内存空间
        file = 0;
    }
    netReply->deleteLater();      //异步删除
    netReply = 0;
}

下载个微信:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36413982/article/details/108187613