注意:这个类的所有函数都是可重入的。
http://qt-project.org/wiki/Download_Data_from_URL
详细描述
QNetworkAccessManager类允许应用程序发送网络请求和接收网络应答。
Network Access API都是围绕着一个QNetworkAccessManager对象构造的,这个对象包含着发送请求的一些通用配置和设置。它包含着代理和缓存的配置,以及和这些事物相关的一些信号,并且应答信号可以作为我们检测一个网络操作的进度。
一个QNetworkAccessManager对于一整个Qt应用程序来说已经足够了!
(QNetworkRequest 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可以停止网络接口。漫游在传输上是同样透明的。每一个入队/挂起的网络请求可以自动的传输到一个新的接入点。
客户希望不作出任何改变就可以利用这个特性。实际上他就像把与特定平台相关的网络连接的代码从应用程序中
删除。