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, QByteArray>,第一個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類似。