Qt网络开发之QNetworkAccessManager使用要点

本文探讨Qt网络开发中QNetworkAccessManager的使用,强调一个应用程序通常一个QNetworkAccessManager即可,QWebpage会依赖单一QNetworkAccessManager。同时提醒,每个QNetworkReply必须正确删除,如在数据接收完成槽中使用deleteLater(),以避免内存泄露。

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>)));





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值