Qt網絡開發之QNetworkAccessManager使用要點


 要點一:對於一個應用程序,一個QNetworkAccessManager就足夠了,當然使用多個QNetworkAccessManager也是沒有問題的,Webkit中一個QWebpage只會使用一個QNetworkAccessManager。

    要點二:每一個回復QNetworkReply都需要刪除,否則會出現內存泄露,根據Qt的幫助文檔,在接收完數據的槽中使用deleteLater(),防止內存泄露。

 MyNetManager.h

 

#ifndef MYNETMANAGER_H
#define MYNETMANAGER_H
 
        
#include <QObject>
#include <QNetworkAccessManager>
 
        
class MyNetManager : public QObject
{
    Q_OBJECT
public:
    explicit MyNetManager(QNetworkAccessManager *pManager);
    ~MyNetManager();
    bool get(QUrl url);
    bool post(QUrl url,QByteArray& bytes);
signals:
 
         
         
        
public slots:
    void downloadProgress(qint64 bytesSent, qint64 bytesTotal);
    void finished();
private:
    QNetworkAccessManager *m_pManager;
 
        
};
 
        
#endif // MYNETMANAGER_H
 
        

 

MyNetManager.cpp
 
        
#include "mynetmanager.h"
#include <QUrl>
#include <QByteArray>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <iostream>
using namespace std;
 
        
MyNetManager::MyNetManager(QNetworkAccessManager *parent) :
    m_pManager(parent){
 
        
}
 
        
MyNetManager::~MyNetManager(){
 
        
}
 
        
bool MyNetManager::get(QUrl url){
    QNetworkRequest request;
    request.setUrl(url);
    QNetworkReply *reply = m_pManager->get(request);
    connect(reply,SIGNAL(finished()),this,SLOT(finished()));
    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
            this,SLOT(downloadProgress(qint64,qint64)));
    return true;
}
 
         
         
        
bool MyNetManager::post(QUrl url, QByteArray &bytes){
    QNetworkRequest request;
    request.setUrl(url);
    QNetworkReply *reply = m_pManager->post(request,bytes);
    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
            this,SLOT(downloadProgress(qint64,qint64)));
    return true;
}
 
        
void MyNetManager::finished(){
    QNetworkReply* reply = (QNetworkReply*)sender();
    reply->deleteLater();
}
 
        
void MyNetManager::downloadProgress(qint64 bytesSent, qint64 bytesTotal){
    cout<< "\ndownloadProgress done:\n";
    cout << "bytesSent: " << bytesSent
         << "  " << "bytesTocal: " << bytesTotal;
}
main.cpp
 
        
 
        
 
        
 
        
 
        
#include "mynetmanager.h"
#include <QCoreApplication>
#include <QUrl>
 
        
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
        
    QNetworkAccessManager *netManager =new QNetworkAccessManager();
    MyNetManager manager(netManager);
    manager.get(QUrl("http://blog.csdn.net/u010002704"));
    return a.exec();
}
 
        
//以下來自Qt文檔
 
        
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(replyFinished(QNetworkReply*)));
 
        
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
 
        
QNetworkRequest request;
request.setUrl(QUrl("http://qt-project.org"));
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>)));


免責聲明!

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



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