在Qt网络编程中,须要用到协议,即HTTP。它是超文本传输协议,它是一种文件传输协议。html
新建工程名为“http”,而后选中QtNetwork模块,最后Base class选择QWidget。注意:若是新建工程时没有添加QtNetwork模块,那么就要手动在工程文件.pro中添加代码linux
- QT += network
代表咱们使用了网络模块。编程
2.咱们在widget.ui文件中添加一个 Text Browser ,以下图。网络
实现的代码以下:ide
widget.h文件:函数
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QNetworkAccessManager> #include <qtextcodec.h> #include <QNetworkReply> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; QNetworkAccessManager* manager; private slots: void replyFinished(QNetworkReply *); }; #endif // WIDGET_H
widget.cpp文件:ui
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); manager = new QNetworkAccessManager(this); connect(manager,SIGNAL(finished(QNetworkReply*)), //关联信号和槽 this,SLOT(replyFinished(QNetworkReply*))); manager->get(QNetworkRequest(QUrl("http://www.baidu.com"))); //发送请求 } Widget::~Widget() { delete ui; } void Widget::replyFinished(QNetworkReply *reply) //当回复结束后 { QTextCodec *codec = QTextCodec::codecForName("utf8"); //使用utf8编码,这样才能够显示中文 QString all = codec->toUnicode(reply->readAll()); ui->textBrowser->setText(all); reply->deleteLater(); //最后要释放reply对象 }
代码分析。this
上面实现了最简单的应用HTTP协议下载网页的程序。QNetworkAccessManager类用于发送网络请求和接受回复,具体的,它是用QNetworkRequest类来管理请求,QNetworkReply类进行接收回复,并对数据进行处理。编码
在上面的代码中,咱们使用了下面的代码来发送请求:url
- manager->get(QNetworkRequest(QUrl(“http://www.yafeilinux.com”)));
它返回一个QNetworkReply对象,这个下面再讲。咱们只需知道只要发送请求成功,它就会下载数据。而当数据下载完成后,manager会发出finished()信号,咱们对它进行了关联:
- connect(manager,SIGNAL(finished(QNetworkReply*)),
- this,SLOT(replyFinished(QNetworkReply*)));
也就是说,当下载数据结束时,就会执行replyFinished()函数。在这个函数中咱们对接收的数据进行处理:
- QTextCodec *codec = QTextCodec::codecForName(“utf8″);
- QString all = codec->toUnicode(reply->readAll());
- ui->textBrowser->setText(all);
这里,为了能显示下载的网页中的中文,咱们使用了QTextCodec 类对象,应用utf8编码。
使用reply->readAll()函数就能够将下载的全部数据读出。而后,咱们在textBrowser中将数据显示出来。当reply对象已经完成了它的功能时,咱们须要将它释放,就是最后一条代码:
- reply->deleteLater();
2、功能扩展
开始咱们先让进度条隐藏。当咱们在Line Edit中输入下载地址,点击下载按钮后,咱们应用输入的下载地址,得到文件名,在磁盘上新建一个文件,用于保存下载的数据,而后进行连接,并显示进度 条。在下载过程当中,咱们将每次得到的数据都写入文件中,并更新进度条,在接收完文件后,咱们从新隐藏进度条,并作一些清理工做。
经过上面的例子能够看到,Qt中编写基于HTTP协议的程序是十分简单的,只有十几行代码。不过,通常咱们下载文件都想要看到下载进度。下面咱们就更改上面的程序,让它能够下载任意的文件,而且显示下载进度。
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QNetworkAccessManager> #include <qtextcodec.h> #include <QNetworkReply> #include <QFile> #include <QFileInfo> #include <QDebug> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void startRequest(QUrl url); //请求连接 protected: //void changeEvent(QEvent *e); private: Ui::Widget *ui; QNetworkAccessManager* manager; QNetworkReply *reply; QUrl url; //存储网络地址 QFile *file;//存储文件 private slots: void on_download_clicked(); void httpFinshed(); void httpReadyRead(); void updataDataReadProcess(qint64,qint64 );//更新进度条 }; #endif // WIDGET_H
3.widget.cpp文件
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); manager = new QNetworkAccessManager(this); ui->progressBar->hide(); } Widget::~Widget() { delete ui; } void Widget::on_download_clicked() { url=ui->lineEdit->text(); //获取在界面输入的url地址 QFileInfo info(url.path()); QString filename(info.fileName()); //获取文件名 if(filename.isEmpty()) filename="index.html"; file=new QFile(filename); if(!file->open(QIODevice::WriteOnly)) { //qDebug<<"file open errror"; delete file; file=0; return; } startRequest(url);//进行连接请求 ui->progressBar->setValue(0);//进度条的值设为零 ui->progressBar->show(); //显示进度条 } void Widget::startRequest(QUrl url) //连接请求 { reply = manager->get(QNetworkRequest(url)); //下面关联信号和槽 connect(reply,SIGNAL(finished()),this,SLOT(httpFinished())); //下载完成后 connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead())); //有可用数据时 connect(reply,SIGNAL(downloadProgress(qint64,qint64)), this,SLOT(updateDataReadProgress(qint64,qint64))); //更新进度条 } void Widget::httpReadyRead() //有可用数据 { if (file) file->write(reply->readAll()); //若是文件存在,则写入文件 } void Widget::updataDataReadProcess(qint64 bytesRead, qint64 totalBytes) { ui->progressBar->setMaximum(totalBytes); //最大值 ui->progressBar->setValue(bytesRead); //当前值 } void Widget::httpFinshed() //完成下载 { ui->progressBar->hide(); file->flush(); file->close(); reply->deleteLater(); reply = 0; delete file; file = 0; }
咱们HTTP应用的内容就讲到这里,能够看到它是很容易的,也不须要你了解太多的HTTP的原理知识。关于相关的类的其余使用,你能够查看其帮助