2012-06-30 57 views
1

我想用下面的代码下载网页的源代码 头文件:QNetworkAccessManager问题越来越网页

#include <QObject> 
#include <QHttp> 
#include <QtNetwork> 
#include <QFile> 
#include <QDebug> 

class CDownloader : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit CDownloader(QObject *parent = 0); 

void Do_Download(); 

signals: 

public slots: 
    void result(QNetworkReply*); 
private: 
    QNetworkAccessManager *manager; 
    QNetworkReply *reply; 
    QNetworkAccessManager qnam; 
}; 

#endif // CDOWNLOADER_H 

和源文件:

#include "cdownloader.h" 

CDownloader::CDownloader(QObject *parent) : 
QObject(parent) 
{  
} 

void CDownloader::Do_Download() 
{ 
    manager = new QNetworkAccessManager(this); 
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(result(QNetworkReply*))); 
    manager->get(QNetworkRequest(QUrl("http://www.google.com"))); 
} 

void CDownloader::result(QNetworkReply *reply) 
{ 
    qDebug() << "loading complete"; 
} 

和按钮代码:

void MainWindow::on_download_clicked() 
{ 
    CDownloader cDown; 
    cDown.Do_Download(); 
} 

但是在结果插槽中永远不会调用qDebug。我错过了什么?

+0

就我所见,您的代码看起来不错。介意发布完整的代码? –

+0

@ion代码中存在内存泄漏。您必须在'finished()'处理程序中删除QNetworkReply。你可以使用'reply-> deleteLater()'。 –

回答

4
void MainWindow::on_download_clicked() 
{ 
    CDownloader cDown; 
    cDown.Do_Download(); 
} 

当该方法返回时,cDown被立即销毁。至少只要您没有收到并处理回复,您就需要保持该对象存活。

为此,要么cDown应该是你MainWindow的成员,或指针(或收集指针的)CDownloader应保持(和适当地处理)在代码某处。

+0

是的,你是对的,使成员解决了这个问题 –