QNetworkAccessManager类允许程序向网络发送请求以及接收回应。
网络访问接口(Network Access API)是围绕着单个QNetworkAccessManager 对象构建起来的,该对象保存咯为它发出的请求所设置的通用选项。它包含代理和缓存设置,还有与这两个东西相关的信号,以及一些可用来得知某个网络操作的进度的回应信号。对于整个Qt 程序来说,一个QNetworkAccessManager 应该就够用咯。
一旦某個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具有一个异步的接口。当上面所写的 replyFinished 槽被调用时,它所需要的参数就是一个包含咯下载的数据及元数据(协议头,等等)的 QNetworkReply 对象。
注意: 当请求完成之后,程序猿需要在某個适当的时间删除那個 QNetworkReply 对象。不要直接在连接到 finished ()的槽中删除它。你可以使用 deleteLater ()函数。
注意:QNetworkAccessManager将它接受的请求放到队列中。并行处理的请求的个数取决于所使用的协议。目前的情况是,对于桌面平台上的超文本传输协议,同一个主机/端口组合可同时执行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 > )));
由于Qt 4.7 中新加入咯 运营商( Bearer )管理 接口,∴QNetworkAccessManager 获取咯管理网络连接的能力。如果设备当前是离线状态,则QNetworkAccessManager可以启动网络接口;而如果当前进程是使用上行线路的最后一个进程,则QNetworkAccessManager可以关闭对应的接口。注意某些平台在最后一个程序停止使用网络的时间与系统真正关闭连接的时间之间会有一个等待时间。漫游是非常透明的。任何位于队列中的/等待中的网络请求都会自动地转移到新的接入点。
那些想要使用这个特性的程序应该不用做任何改动。实际上,看起来那些已有的与平台相关的连接代码可以删除掉咯。
注意: QNetworkAccessManager 中的 网络和漫游支持仅限于平台支持连接管理的情况下才可用。 QNetworkConfigurationManager::NetworkSessionRequired 可用来探测QNetworkAccessManager 是否使用这个特性。目前仅有Meego/Harmattan 和Symbian平台提供咯对连接管理的支持。
注意:这個特性不能与QtMobility 提供的运营商管理接口一起使用。妳写的程序必须迁移到Qt 版本的运营商管理上。
在Symbian上,那些使用这個特性的进程必须拥有 NetworkServices 平台安全能力。如果程序缺少这种能力,那么相关的操作会导致崩溃。
平台安全能力是通过 TARGET.CAPABILITY 这個qmake 变量来添加的。
参考 QNetworkRequest 、 QNetworkReply 和 QNetworkProxy 。
HxLauncher: Launch Android applications by voice commands