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

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

  1. QT += network

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

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

实现的代码如下:

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 = );
~Widget(); private:
Ui::Widget *ui;
QNetworkAccessManager* manager;
private slots:
void replyFinished(QNetworkReply *);
}; #endif // WIDGET_H

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);
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对象
}

代码分析。

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

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

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

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

  1. connect(manager,SIGNAL(finished(QNetworkReply*)),
  2. 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对象已经完成了它的功能时,我们需要将它释放,就是最后一条代码:

  1. reply->deleteLater();
 
二、功能扩展
开始我们先让进度条隐藏。当我们在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 = );
~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=;
return;
}
startRequest(url);//进行链接请求
ui->progressBar->setValue();//进度条的值设为零
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 = ;
delete file;
file = ;
}

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

												

qt 之http学习的更多相关文章

  1. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. Qt 智能指针学习(7种指针)

    Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...

  4. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  5. qt和makefile学习网址

    http://blog.51cto.com/zt/20/1/   ---qt学习网站 http://www.chinaunix.net/old_jh/23/408225.html  [精华] 跟我一起 ...

  6. 【Qt官方例程学习笔记】Application Example(构成界面/QAction/退出时询问保存/用户偏好载入和保存/文本文件的载入和保存/QCommandLineParser解析运行参数)

    The Application example shows how to implement a standard GUI application with menus, toolbars, and ...

  7. 【Qt官方例程学习笔记】Raster Window Example(画笔的平移/旋转/缩放应用)

    这个例子显示了如何使用QPainter渲染一个简单的QWindow. 值得学习的内容 <QtGui>头文件 #include <QtGui>就可以使用Qt GUI模块中的所有类 ...

  8. 【Qt官方例程学习笔记】Analog Clock Window Example (画笔的平移/旋转/缩放应用)

    这个例子演示了如何使用QPainter的转换和缩放特性来简化绘图. 值得学习的: 定时器事件ID检查: 在定时器事件中检查定时器id是比较好的实践. QPainter抗锯齿: We call QPai ...

  9. QT下QThread学习(二)

    学习QThread主要是为了仿照VC下的FTP服务器写个QT版本.不多说,上图. FTP服务器的软件结构在上面的分析中就已经解释了,今天要解决的就是让每一个客户端的处理过程都可以按一个线程来单独跑.先 ...

  10. Qt之Qwt学习之安装

    QWT+qtcreator 编译.安装使用 目录:一.Qwt简介 二.QWT编译 一.Qwt简介 QWT:Qt Widgets for Technical Applications,是开源的2D绘图库 ...

随机推荐

  1. 安卓开发之sql语句增删改查2(利用谷歌封装好的API进行增删改查)

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  2. docker-compose deploy replicaSet in standalone MongoDB cluster and with auth

    经过两天的折腾,终于实现了自己想要的效果,就是通过docker-compose 部署最新的mongodb replicaSet, 主要是为了测试 4.2 最新的多文档事务,下面将整个步骤分享一下: d ...

  3. mysql in 中使用子查询,会不使用索引而走全表扫描

    所以可以将 in 条件中 子查询转换成一张子表,从而通过 join 的形式进行条件限制.

  4. Jerry和您聊聊Chrome开发者工具

    Chrome开发者工具是Jerry日常工作使用的三大调试器之一.虽然工具名称前面带了个"开发者", 但是它对非开发人员仍然有用.不信? 用Chrome打开我们常用的网站,按F12, ...

  5. BBPlus团队ALPHA冲刺博客(肖文恒)

    ALPHA冲刺博客 第一天:https://www.cnblogs.com/bbplus/p/11931039.html 第二天:https://www.cnblogs.com/bbplus/p/11 ...

  6. 根据CPU核心数确定线程池并发线程数(转)

    一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...

  7. Oracle问题总结

    1.账号锁定了 2.忘记密码 3.Oracle create session权利 4.oracle中单引号和双引号的作用 5.不支持 insert into tableName values (... ...

  8. Vue移动端焦点状态跳转页面,焦点和键盘不消失的问题

    问题:input搜索,在移动端焦点状态跳转页面,焦点不失焦,还在跳转后的页面闪烁,且键盘不消失 //主动隐藏键盘 document.getElementById('inputSearch').blur ...

  9. 如何处理不能新建word、excel、PPT的情况?

    Office系列办公软件是大家都非常喜欢使用的软件,但是有些朋友反映在使用电脑时,在桌面右键菜单新建选项里没有Word.Excel或PPT,非常的耽误工作. 下面就为大家介绍一下桌面右键菜单新建选项里 ...

  10. 从Windows文件夹到Linux分区

    1. 先说几句 如果你, 知道什么是Windows系统 简单使用Windows系统 想要了解或安装Linux 刚接触Linux会有以下疑惑, 什么是分区? 如何建立分区? 怎么安装系统到到D盘? 安装 ...