Qt网络编程之QNetworkReply
注意:这个类中的所有函数都是可重入的。
这个类是从Qt4.4引入的。
详细描述:
QNetworkReply 类包含了发送给QNetworkManager的数据和首部。
QNetworkReply类包含了发送给QNetworkAccessManager请求的所有应答数据。和QNetworkRequest类似,这些数据包含了一个URL和一些首部信息(同时包含解析后的和原始形式的),以及一些和应答状态相关的信息,再加上应答信息自身的内容。
QNetworkReply是一个顺序访问的QIODevice,这也意味着一旦数据从该对象中读取出来,那么该对象就不再持有这些数据。因此,当需要保存数据的时候,这个工作应该由应用程序完成。无论什么时候从网络中获取到更多数据并进行处理,readyRead()信号都会被触发。
downloadProgress()信号在接收到数据的时候也会被发送,但是它所持有的数据量不一定就是真实接收到的数据量,如果对这些内容的传输进行操作(例如:解压缩,移除协议头信息)。
尽管QNetworkReply是一个与应答信息关联的QIODevice,它同样触发uploadProgress()信号,这表明upload操作拥有这些数据。
注意:不要在连接到error()或者finished()的槽函数里删除该对象,应该使用deleteLater()。
成员类型文档
enum QNetworkReply::NetworkError
表明在处理请求的过程中所有可能的错误情况
Constant Value Description
《一些枚举类型,内容太多,自己看帮助文档》
typedef QNetworkReply::RawHeaderPair
RawHeaderPair是一个 QPair,第一个QByteArray 代表头部的名字;第二个代表头部信息。
void QNetworkReply::finished () [signal]
当应答信息被处理完毕时这个信号就会被触发。当这个信号被触发后,就不会再对应答数据或者元数据进行更新。除非close()被调用,否则应答信息会一直被打开等待读取,可以通过read()或者readAll()方法读取数据。特别地,在readyRead后如果没有调用read(),那么调用readAll()就会将所有的内容都存储在一个QByteArray中。
这个信号和QNetworkAccessManager::finished()是串联触发的。
注意:
不要在与这个信号关联的槽函数中直接删除掉QNetworkReply对象,应该使用deleteLater()。
你可以在收到finished()信号之前使用isFinished()函数检查一个QNetworkReply是否已经结束。
另外一些重要的函数就是对应答信息的读取函数了:
void QNetworkReply::downloadProgress ( qint64 bytesReceived, qint64 bytesTotal ) [signal]
这个信号被触发,用来表明该网络请求的下载部分的进度。如果该网络请求没有相关联的下载部分,这个信号在参数bytesReceived和bytesTotal的值都为0的时候会被触发一次。
参数bytesReceived表明已经接收到的数据量,而bytesTotal则表明总共期望下载的数据量。如果期望下载的数据量未知,那么bytesTotal就为-1。
当bytesReceived和bytesTotal相等的时候就表明下载完毕。那时,bytesTotal就不等于-1了。
注意,bytesReceived和bytesTotal的值也许都和size()不同,通过read()或者readAll()获得的总的数据量,或者表明数据量的头部的值(ContentLengthHeader)。造成这种情况的原因是,协议头部或者是数据在下载的过程总可能被压缩。
void QNetworkReply::uploadProgress ( qint64 bytesSent, qint64 bytesTotal ) [signal]
该信号表示的是网络请求中上传的部分,其它都和上面的downloadProgress类似。
阅读(1287) | 评论(0) | 转发(0) |