2012-06-30 55 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

是的,你是對的,使成員解決了這個問題 –