【问题标题】:QNetworkAccessManager issue getting web pageQNetworkAccessManager 获取网页的问题
【发布时间】:2012-06-30 20:07:05
【问题描述】:

我正在尝试使用以下代码下载网页的源代码 头文件:

#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。我错过了什么?

【问题讨论】:

  • 就我所见,您的代码看起来不错。介意发布完整的代码吗?
  • @ion 代码中存在内存泄漏。您必须在 finished() 处理程序中删除 QNetworkReply。你可以使用reply-&gt;deleteLater()

标签: c++ qt qnetworkaccessmanager


【解决方案1】:
void MainWindow::on_download_clicked()
{
  CDownloader cDown;
  cDown.Do_Download(); 
}

当该方法返回时,cDown 立即被破坏。只要您还没有收到和处理回复,您就需要至少保持该对象处于活动状态。

为此,cDown 应该是您的 MainWindow 的成员,或者应该在您的代码中的某处维护(并妥善处理)指向(或指向)CDownloader 的指针(或指针集合)。

【讨论】:

    猜你喜欢
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2020-07-03
    • 2018-12-07
    相关资源
    最近更新 更多