您的位置:首页 > 编程语言 > Qt开发

Qt网络编程之QNetworkAccessManager

2012-03-25 02:14 459 查看
注意:这个类的所有函数都是可重入的。

这个类是从Qt4.4引入的。

详细描述

QNetworkAccessManager类允许应用程序发送网络请求和接收网络应答。

Network Access API都是围绕着一个QNetworkAccessManager对象构造的,这个对象包含着发送请求的一些通用配置和设置。它包含着代理和缓存的配置,以及和这些事物相关的一些信号,并且应答信号可以作为我们检测一个网络操作的进度。

一个QNetworkAccessManager对于一整个Qt应用程序来说已经足够了!

一旦一个QNetworkAccessManager对象被创建了,那么应用程序就可以使用它在网络上发送请求。它提供了一组标准的函数,可以承载网络请求和一些可选的数据,并且每一个请求返回一个QNetworkReply对象。该返回的对象包含着返回的请求应带的所有数据。

一个简单的从网络下载的例子可如下完成:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);

connect(manager, SIGNAL(finished(QNetworkReply*)),

this, SLOT(replyFinished(QNetworkReply*)));

manager->get(QNetworkRequest(QUrl("http://qt.nokia.com")));

QNetworkAccessManager有一个异步的API。当上面的replyFinished槽被调用的时候,它带的参数就是包含有下载的数据

的QNetworkReply对象。

注意:当请求完成的时候,程序员需要在适当的时候删除QNetworkReply对象。不要在连接到信号finished()的槽函数中直接

删除掉。你可以使用deleteLater()函数。

注意:QNetworkAccessManager将会把它受到的请求排队。并行执行的请求数量是依赖于协议的。目前,对于桌面平台的HTTP协议,对于一个主机/端口的组合,可6个请求并行执行。

一个更加复杂的例子,假设manager已经存在,代码如下:

QNetworkRequest request;

request.setUrl(QUrl("http://qt.nokia.com"));

request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

QNetworkReply *reply = manager->get(request);

connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));

connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),

this, SLOT(slotError(QNetworkReply::NetworkError)));

connect(reply, SIGNAL(sslErrors(QList<QSslError>)),

this, SLOT(slotSslErrors(QList<QSslError>)));

网络和漫游支持

在Qt4.7版本中,QNetworkAccessManager有了额外的Bearer ManagementAPI支持,使得QNetworkAccessManager具有了管理管理网络连接的能力。

QNetworkAccessManager可以在设备离线的时候启用网络接口,并且如果当前进程是最后一个使用网络的时候,QNetworkAccessManager可以停止网络接口。漫游在传输上是同样透明的。每一个入队/挂起的网络请求可以自动的传输到一个新的接入点。

客户希望不作出任何改变就可以利用这个特性。实际上他就像把与特定平台相关的网络连接的代码从应用程序中

删除。

成员类型文档

enum QNetworkAccessManager::NetworkAccessibility

表明是否可以通过网络管理接入网络

Constant Value Description

QNetworkAccessManager::UnknownAccessibility -1 The network accessibility cannot be determined.

QNetworkAccessManager::NotAccessible 0 The network is not currently accessible, either because there is currently no network coverage or network access has been explicitly disabled by a call to setNetworkAccessible().

QNetworkAccessManager::Accessible 1 The network is accessible.

enum QNetworkAccessManager::Operation

表明这个对于一个应答的处理过程

Constant Value Description

QNetworkAccessManager::HeadOperation 1 retrieve headers operation (created with head())

QNetworkAccessManager::GetOperation 2 retrieve headers and download contents (created with get())

QNetworkAccessManager::PutOperation 3 upload contents operation (created with put())

QNetworkAccessManager::PostOperation 4 send the contents of an HTML form for processing via HTTP POST (created with post())

QNetworkAccessManager::DeleteOperation 5 delete contents operation (created with deleteResource())

QNetworkAccessManager::CustomOperation 6 custom operation (created with sendCustomRequest())

属性文档

networkAccessible : NetworkAccessibility

这个属性表明当前是否可以通过网络管理接入网络。

如果网络不可接入,那么network access manager将不会处理任何新的网络请求,所有这些请求都会发生错误而失败。

那些以file:// scheme作为URLs的请求仍然会被处理。

这个属性的默认值反应了设备的物理状态。应用程序可以通过如下操作来覆盖它的值以禁止任何网络请求。

networkAccessManager->setNetworkAccessible(QNetworkAccessManager::NotAccessible);

我们可以通过如下调用来再次使能网络:

networkAccessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);

注意:调用setNetworkAccessible()并不会改变网络状态。

Access functions:

NetworkAccessibility networkAccessible () const

void setNetworkAccessible ( NetworkAccessibility accessible )

Notifier signal:

void networkAccessibleChanged ( QNetworkAccessManager::NetworkAccessibility accessible )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: