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

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;
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值