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類似


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM