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的原理知识。关于相关的类的其他使用,你可以查看其帮助
标签:Widget,http,Qt,void,学习,ui,reply,include,下载 来源: https://www.cnblogs.com/ybqjymy/p/15791259.html