1

ヘッダーファイルに次のコードが含まれているWebページのソースコードをダウンロードしようとしています。

#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が結果スロットで呼び出されることはありません。私は何が欠けていますか?

4

1 に答える 1

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

そのメソッドが戻ると、cDownすぐに破棄されます。少なくとも応答を受信して​​処理していない限り、そのオブジェクトを存続させる必要があります。

そのためにはcDown、のメンバーであるかMainWindow、またはへのポインタ(またはへのポインタのコレクション)CDownloaderをコード内のどこかに維持(および適切に破棄)する必要があります。

于 2012-06-30T12:07:05.950 に答える