`
Riddick
  • 浏览: 640829 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

QHttp

阅读更多

QHttp是Qt所提供有关网络的高阶API,可以协助我们进行HTTP协议的进行,QHttp发出请求时是非同步的,请求的过程中会发出相关的Signal,我们可以用Slot来接收这些Signal,并进行相关的处理。

 

以下先示范一个最基本的QHttp使用,程序将设计一个HttpGet类:

 

HttpGet.h

#ifndef HTTPGET_H
#define HTTPGET_H

#include <QObject>
class QUrl;
class QHttp;
class QFile;

class HttpGet : public QObject {
      Q_OBJECT
public:
       HttpGet(QObject *parent = 0);
       void downloadFile(const QUrl &url);
       
signals:      
       void finished();
       
private slots:
        void done(bool error);
        
private:
        QHttp *http;
        QFile *file;
};
#endif

 这个HttpGet可以让我们指定文件的URL地址,以HTTP方式取得文件并存储在本地,URL在Qt中以QUrl代表,当文件下载完成时,会发出finished()的Signal,当QHttp所指定的全部请求完成时,会发出done()的Signal,HTTPGet类中自定义的Slot就是用来接收QHttp的done() Signal以进行相关处理的,这可以在HttpGet的实现中看到:

 

HttpGet.cpp:

#include <QtNetwork>
#include <QFile>
#include <iostream>
#include "HttpGet.h"
using namespace std;

HttpGet::HttpGet(QObject *parent) : QObject(parent) 
{
    http = new QHttp(this);
    connect(http, SIGNAL(done(bool)), this, SLOT(done(bool)));                         
}

void HttpGet::downloadFile(const QUrl &url)
{
    QFileInfo fileInfo(url.path());
    QString fileName = fileInfo.fileName();
    if(fileName.isEmpty())
    {
        fileName = "index.html";                      
    }
    file = new QFile(fileName);
    if(!file->open(QIODevice::WriteOnly))
    {
        cerr<<"Unable to save the file"<<endl;
        delete file;
        file = 0;
        return;                                     
    }
    http->setHost(url.host(), url.port(80));
    http->get(url.path(), file);
    http->close();
}

void HttpGet::done(bool error)
{
    if(error)
    {
        cerr<<"Error: "<<qPrintable(http->errorString())<<endl;         
    }     
    else 
    {
        cerr<<"File downloaded as "<<qPrintable(file->fileName())<<endl;     
    }
    file->close();
    delete file;
    file = 0;
    
    emit finished();
}

 要使用Qt的网络相关类必须引进QtNetwork,并且必须在pro文件中加入以下这行以在构建过程中使用Qt的网络组件:

QT += network

 当调用HttpGet类的downloadFile()方法时,程序中使用QUrl的path()来取得路径信息,如果路径信息中没有包括文件名,就使用预设的"index.html"作为请求的对象及下载后存档时的文件名,要使用QHttp来请求文件时,必须使用setHost()来设定主机及端口号信息,接着使用get()方法发出请求,并通知下载的文件要到哪个QFile来存储。

当QHttp所有请求处理完毕后,会发出done()的Signal,程序中将之连接到HttpGet的done()来处理,处理完成后再发出finished的Signal。

以下是个测试类:

#include <QCoreApplication>
#include <QUrl>
#include "HttpGet.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    HttpGet getter;
    getter.downloadFile(QUrl("Http:\\www.iprai.com/index.html"));
    QObject::connect(&getter, SIGNAL(finished()), &app, SLOT(quit()));
    return app.exec();
}

 程序中将HttpGet的finished()的Signal连接到QCoreApplication的quit(),如此当下载文件完成后,可以直接关闭程序。

 

Qt的QHttp与QFtp在使用上有许多类似的地方,可以在以上的实例中看到一些特性,以下整理出相关的特性:

1) 非阻塞行为,请求时非同步的。

2) 我们可以设定一连串的请求,每个请求都有一个Command ID,QHttp的requestStarted()与requestFinished()等Signal会带有请求的Command ID,我们可以用以追踪骑请求的执行。

3) 在数据传输过程中,有相关的Signal可以追踪进度,像是QHttp的dataReadProgress()、dataSendProgress()等Signal。

4) 支援QIODevice的写入和读取,还有以QByteArray为基础的API。

 

分享到:
评论

相关推荐

    QHttp获取网页源码

    本篇将详细讲解如何使用Qt库中的QHttp模块来获取网页源码。 首先,QHttp是Qt早期版本(Qt 3.x)中的一个网络组件,用于HTTP协议的客户端操作,如发送请求和接收响应。在Qt 4.x及更高版本中,QHttp已被更现代、功能...

    QT5中使用QHttp类.rar

    尽管QT5已经推出了更先进的网络模块如QNetworkAccessManager,但有时开发者可能需要使用QT4遗留的QHttp类,特别是当他们熟悉这个旧接口或者有特定需求时。"QT5中使用QHttp类.rar"这个资源可能包含了一个示例项目或...

    Qt-QHttp源码

    **Qt-QHttp源码解析** Qt是一个跨平台的C++应用程序开发框架,广泛应用于图形用户界面、网络编程、多媒体处理等多个领域。QHttp是Qt库中的一个组件,它为开发者提供了一种简单、高效的网络访问接口,使得在Qt应用...

    qt5-QHttp类源码

    在Qt5中,尽管QHttp已经被弃用,取而代之的是更现代、功能更全面的QNetworkAccessManager和相关类,但理解QHttp的工作原理和结构对于学习Qt的网络编程仍然是有价值的。 QHttp类主要包含以下几个关键概念和方法: 1...

    qhttp-master.zip

    由于Qt5.x版本对许多组件进行了重构和优化,QHTTP并未随Qt升级到新版本,因此对于那些仍依赖Qt4.x环境或者希望使用QHTTP功能的开发者来说,这个类库依然具有一定的价值。 QHTTP的核心功能在于提供了HTTP请求的发送...

    qhttp:Qt5和c ++ 14中的轻量级异步HTTP库(服务器和客户端)

    QHttp库采用Qt的信号与槽机制,充分利用了Qt的事件驱动模型,使得网络I/O操作可以非阻塞地进行。当HTTP请求或响应准备就绪时,相应的信号会被触发,用户可以通过连接这些信号来处理网络事件,而不会阻塞主线程。 **...

    Http协议下载网络图片,保存本地

    本主题将深入探讨如何使用Qt库中的QHttp协议来下载网络上的图片并将其保存到本地文件系统。 首先,让我们理解HTTP协议。HTTP是一种无状态、基于请求与响应模型的应用层协议,它定义了客户端(通常是Web浏览器)和...

    Qt Network Demo_QT_qthttp_Network_C++_qt开发can通讯.zip

    《Qt Network Demo:QT QHTTP网络通信与C++在CAN通讯中的应用》 Qt Network模块是Qt库中的一部分,主要用于处理各种网络通信任务,包括HTTP、FTP、TCP/IP等。这个压缩包“Qt Network Demo_QT_qthttp_Network_C++_qt...

    Qt实现的下载管理器

    在本项目中,Qt的QHttp模块被用来实现网络通信,进行文件的下载操作。 QHttp是Qt的一个非官方扩展库,用于HTTP协议的处理。虽然Qt5及更高版本中已经内置了更强大的QNetworkAccessManager来处理网络请求,但在早期的...

    本文基于Qt5.8利用HTTP协议实现文件的下载

    从Qt 5.0 版本开始, 删除了QHttp 和 QFtp 类, 通过QNetworkReplyQNetworkAccessManager、QNetworkRequest类实现基于HTTP和FTP协议的应用程序。除了HTTP和FTP协议外, 该类还可以实现高层(OSI 7层中的上层)网络应用...

    http加密方法

    ### SSL/TLS协议 ...SSL是TLS的前身,但随着安全标准的提高,目前广泛使用的是TLS协议。...- **对称加密**:在TLS握手阶段,双方通过非对称加密方式交换一个随机生成的对称密钥,之后的数据传输将采用这个对称密钥进行...

    QT中的服务器与客户端

    QT的网络模块主要包含在`QtNetwork`库中,它提供了一系列类用于处理网络通信,如`QTcpServer`、`QTcpSocket`、`QUdpSocket`、`QHttp`等。这些类可以帮助我们构建基于TCP和UDP的服务器和客户端,以及HTTP协议的应用。...

    webservice_.zip

    3. **QHttp和QNetworkAccessManager**:对于RESTful Web服务,Qt的网络模块提供了QHttp类(在较新版本中已被弃用,推荐使用QNetworkAccessManager)用于发送HTTP请求。通过这些类,可以方便地向Web服务发送GET、POST...

    Quectel_EC200x&EG912Y&EC600S系列_HTTP(S)_应用指导_V1.0

    **Quectel EC200x&EG912Y&EC600S系列_HTTP(S)_应用指导_V1.0** 是一份由上海移远通信技术股份有限公司提供的技术文档,主要针对其LTE标准模块系列——EC200x、EG912Y和EC600S,详细阐述了如何在这些模块上实现HTTP(S...

    QHttpFile_demo

    刚刚用qt写开始写网络文件下载,碰到不少困难,终于完成了个测试版本,可以测试断点下载,动态网址好像不行,只能全部下载。 不幸的是写好了,现在源代码已经不见了,还好有个测试模块,要的就拿了,可以满足一般...

    Inno Setup 5.4 with CodeSign Support

    SignCode=$qSignTools\signtool.exe$q sign /f $qCerts\[Certificate].pfx$q -d $q[Software Name or Company]$q -du $q[http://www.mydomainhost.com]$q /t $qhttp://timestamp.comodoca.com/authenticode$q $f ...

    QT写的点对点视频聊天传文件软件

    在点对点文件传输中,可能需要使用到QT的网络类,如QHttp、QTcpServer和QTcpSocket等,通过TCP或HTTP协议来实现文件的分块传输,确保文件完整性和可靠性。 4. GUI设计:QT的QWidgets或QML模块使得创建用户界面变得...

    QT3.5中文帮助文档.zip

    8. **网络编程**:QT3.5包含网络通信的支持,如QHttp、QTcpSocket等,使开发者能够创建网络客户端和服务器。 9. **数据库连接**:通过QSqlDatabase和相关的SQL类,QT可以方便地与多种数据库系统交互,文档会阐述...

    Quectel_BC20.rar

    《Quectel BC20 AT命令手册》详细列出了所有可用的AT命令,包括基本的AT指令如`AT+CGATT`(连接到GPRS服务)和`AT+COPS`(设置运营商选择),以及针对特定功能的命令如`AT+QGPS`(启动GPS服务)和`AT+QHTTP`(进行...

Global site tag (gtag.js) - Google Analytics