2

Qt を使用して Web ページを取得し、画面に印刷しようとしています。問題は、常に "" と印刷されることです。完了したSLOTにはなりません。connect() に問題があるかどうかはわかりません。コードはエラーなしでコンパイルされます。イベントループはまだ使用しないようにしています。

コードは次のとおりです。

net.h

#ifndef NET_H
#define NET_H

#include <QObject>
#include <QtNetwork>
#include <QString>
#include <QDebug>

class net : public QObject
{
    Q_OBJECT
public:
    explicit net(QObject *parent = 0);
    void get_site(QString url);
    QString data;

signals:

public slots:
    void err(QNetworkReply *);
    void done(QNetworkReply *);

private:

};

#endif // NET_H

net.cpp:

#include "net.h"

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

void net::get_site(QString url) {
    QNetworkAccessManager man;
    QNetworkRequest request;

    request.setUrl (QUrl(url));

    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*)));
    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(err(QNetworkReply *)));

    man.get (QNetworkRequest(QUrl(url)));
}

void net::done(QNetworkReply * reply) {
    data = QString(reply->readAll ());
}

void net::err(QNetworkReply * reply) {
    data = QString(reply->errorString ());
}

そしてmain.cpp:

#include <QCoreApplication>
#include "net.h"


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    net netobj;
    netobj.get_site("http://stackoverflow.com");
    qDebug() << netobj.data;
    return a.exec();
}

4

2 に答える 2

0

QNetworkAccessManager インスタンスは、get_site関数の最後で範囲外になります。Qt のドキュメントによると、Qt アプリケーション全体に対して 1 つの QNetworkAccessManager で十分なはずです。オブジェクトは、その関数のスコープ外で存続する必要があります。これは、その関数が終了するよりも応答を受信するのに時間がかかる可能性があるためです。自動変数ローカルではなく、QNetworkAccessManager をネット クラスのメンバーにしますget_site

deleteを使用するのではなく、QNetworkReply オブジェクトの有効期間も管理する必要があることに注意してくださいdeleteLater()。そうしないと、メモリ リークが発生する可能性があります。

于 2015-01-08T00:18:32.087 に答える