• Qt http学习


    在Qt网络编程中,需要用到协议,即HTTP。它是超文本传输协议,它是一种文件传输协议。

    新建工程名为“http”,然后选中QtNetwork模块,最后Base class选择QWidget。注意:如果新建工程时没有添加QtNetwork模块,那么就要手动在工程文件.pro中添加代码

    QT += network

    表明我们使用了网络模块。

    2.我们在widget.ui文件中添加一个 Text Browser ,如下图。

    实现的代码如下:

    widget.h文件:

     1 #ifndef WIDGET_H
     2 #define WIDGET_H
     3 
     4 #include <QWidget>
     5 #include <QNetworkAccessManager>
     6 #include <qtextcodec.h>
     7 #include <QNetworkReply>
     8 namespace Ui {
     9 class Widget;
    10 }
    11 
    12 class Widget : public QWidget
    13 {
    14     Q_OBJECT
    15 
    16 public:
    17     explicit Widget(QWidget *parent = 0);
    18     ~Widget();
    19 
    20 private:
    21     Ui::Widget *ui;
    22     QNetworkAccessManager* manager;
    23 private slots:
    24     void replyFinished(QNetworkReply *);
    25 };
    26 
    27 #endif // WIDGET_H

    widget.cpp文件:

     1 #include "widget.h"
     2 #include "ui_widget.h"
     3 
     4 Widget::Widget(QWidget *parent) :
     5     QWidget(parent),
     6     ui(new Ui::Widget)
     7 {
     8     ui->setupUi(this);
     9     manager = new QNetworkAccessManager(this);
    10     connect(manager,SIGNAL(finished(QNetworkReply*)),  //关联信号和槽
    11                 this,SLOT(replyFinished(QNetworkReply*)));
    12     manager->get(QNetworkRequest(QUrl("http://www.baidu.com"))); //发送请求
    13 }
    14 
    15 Widget::~Widget()
    16 {
    17     delete ui;
    18 }
    19 void Widget::replyFinished(QNetworkReply *reply)  //当回复结束后
    20 {
    21     QTextCodec *codec = QTextCodec::codecForName("utf8");
    22     //使用utf8编码,这样才可以显示中文
    23     QString all = codec->toUnicode(reply->readAll());
    24     ui->textBrowser->setText(all);
    25     reply->deleteLater();   //最后要释放reply对象
    26 }

    代码分析。

    上面实现了最简单的应用HTTP协议下载网页的程序。QNetworkAccessManager类用于发送网络请求和接受回复,具体的,它是用QNetworkRequest类来管理请求,QNetworkReply类进行接收回复,并对数据进行处理。

    在上面的代码中,我们使用了下面的代码来发送请求:

    manager->get(QNetworkRequest(QUrl(“http://www.yafeilinux.com”))); 

    它返回一个QNetworkReply对象,这个下面再讲。我们只需知道只要发送请求成功,它就会下载数据。而当数据下载完成后,manager会发出finished()信号,我们对它进行了关联:

    connect(manager,SIGNAL(finished(QNetworkReply*)), this,SLOT(replyFinished(QNetworkReply*))); 

     

    也就是说,当下载数据结束时,就会执行replyFinished()函数。在这个函数中我们对接收的数据进行处理:

    1 QTextCodec *codec = QTextCodec::codecForName(“utf8″); 
    2 QString all = codec->toUnicode(reply->readAll()); 
    3 ui->textBrowser->setText(all); 

    这里,为了能显示下载的网页中的中文,我们使用了QTextCodec 类对象,应用utf8编码。

    使用reply->readAll()函数就可以将下载的所有数据读出。然后,我们在textBrowser中将数据显示出来。当reply对象已经完成了它的功能时,我们需要将它释放,就是最后一条代码:

    reply->deleteLater(); 
    二、功能扩展
    开始我们先让进度条隐藏。当我们在Line 
    Edit中输入下载地址,点击下载按钮后,我们应用输入的下载地址,获得文件名,在磁盘上新建一个文件,用于保存下载的数据,然后进行链接,并显示进度
    条。在下载过程中,我们将每次获得的数据都写入文件中,并更新进度条,在接收完文件后,我们重新隐藏进度条,并做一些清理工作。
    通过上面的例子可以看到,Qt中编写基于HTTP协议的程序是十分简单的,只有十几行代码。不过,一般我们下载文件都想要看到下载进度。
    下面我们就更改上面的程序,让它可以下载任意的文件,并且显示下载进度。
    widget.h文件:
     1 #ifndef WIDGET_H
     2 #define WIDGET_H
     3 
     4 #include <QWidget>
     5 #include <QNetworkAccessManager>
     6 #include <qtextcodec.h>
     7 #include <QNetworkReply>
     8 #include <QFile>
     9 #include <QFileInfo>
    10 #include <QDebug>
    11 namespace Ui {
    12 class Widget;
    13 }
    14 
    15 class Widget : public QWidget
    16 {
    17     Q_OBJECT
    18 
    19 public:
    20     explicit Widget(QWidget *parent = 0);
    21     ~Widget();
    22     void startRequest(QUrl url); //请求链接
    23 protected:
    24     //void changeEvent(QEvent *e);
    25 
    26 private:
    27     Ui::Widget *ui;
    28     QNetworkAccessManager* manager;
    29     QNetworkReply *reply;
    30     QUrl url; //存储网络地址
    31     QFile *file;//存储文件
    32 private slots:
    33     void on_download_clicked();
    34     void httpFinshed();
    35     void httpReadyRead();
    36     void updataDataReadProcess(qint64,qint64 );//更新进度条
    37 };
    38 
    39 #endif // WIDGET_H

    widget.cpp文件

     1 #include "widget.h"
     2 #include "ui_widget.h"
     3 
     4 Widget::Widget(QWidget *parent) :
     5     QWidget(parent),
     6     ui(new Ui::Widget)
     7 {
     8     ui->setupUi(this);
     9     manager = new QNetworkAccessManager(this);
    10     ui->progressBar->hide();
    11 }
    12 
    13 Widget::~Widget()
    14 {
    15     delete ui;
    16 }
    17 
    18 void Widget::on_download_clicked()
    19 {
    20     url=ui->lineEdit->text();
    21     //获取在界面输入的url地址
    22     QFileInfo info(url.path());
    23     QString filename(info.fileName());
    24     //获取文件名
    25     if(filename.isEmpty()) filename="index.html";
    26     file=new QFile(filename);
    27     if(!file->open(QIODevice::WriteOnly))
    28     {
    29         //qDebug<<"file open errror";
    30         delete file;
    31         file=0;
    32         return;
    33     }
    34     startRequest(url);//进行链接请求
    35     ui->progressBar->setValue(0);//进度条的值设为零
    36     ui->progressBar->show(); //显示进度条
    37 }
    38 void Widget::startRequest(QUrl url)  //链接请求
    39 {
    40     reply = manager->get(QNetworkRequest(url));
    41     //下面关联信号和槽
    42     connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));
    43     //下载完成后
    44     connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
    45     //有可用数据时
    46     connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
    47             this,SLOT(updateDataReadProgress(qint64,qint64)));
    48     //更新进度条
    49 }
    50 void Widget::httpReadyRead()   //有可用数据
    51 {
    52     if (file) file->write(reply->readAll());  //如果文件存在,则写入文件
    53 }
    54 void Widget::updataDataReadProcess(qint64 bytesRead, qint64 totalBytes)
    55  {
    56     ui->progressBar->setMaximum(totalBytes); //最大值
    57     ui->progressBar->setValue(bytesRead);  //当前值
    58 }
    59 void Widget::httpFinshed()  //完成下载
    60 {
    61     ui->progressBar->hide();
    62     file->flush();
    63     file->close();
    64     reply->deleteLater();
    65     reply = 0;
    66     delete file;
    67     file = 0;
    68 }

    我们HTTP应用的内容就讲到这里,可以看到它是很容易的,也不需要你了解太多的HTTP的原理知识。关于相关的类的其他使用,你可以查看其帮助

  • 相关阅读:
    AC自动机
    概率DP
    POJ 1637 Sightseeing tour(混合图的欧拉回路)
    POJ 3233 Matrix Power Series(矩阵等比求和)
    HDU 2243 考研路茫茫——单词情结(AC自动机+DP+快速幂)
    HDU 3032 Nim or not Nim?(sg函数)
    HDU 3038 How Many Answers Are Wrong(种类并查集)
    HDU 4686 Arc of Dream(快速幂矩阵)
    HDU 3306 Another kind of Fibonacci(快速幂矩阵)
    HDU 3308 LCIS(线段树)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15791259.html
Copyright © 2020-2023  润新知