При попытке получить веб-страницу с использованием Qt QNetworkAccessManager всегда возвращается & quot; & quot;

Я пытаюсь получить веб-страницу с помощью Qt и распечатать ее на экране. Проблема в том, что она всегда печатает «». Это не будет сделано до готового слота. Я не знаю, если что-то не так с 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

2

Решение

В вашем коде есть несколько серьезных проблем. Сначала вы должны иметь QNetworkAccessManager как член класса в .h файле:

class net : public QObject
{
...
private:
QNetworkAccessManager nam;
};

Также не стоит подключать finished сигнал на два разных слота. Ваш get_site функция должна быть такой:

void net::get_site(QString url) {

QNetworkRequest request;
request.setUrl (QUrl(url));

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

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

И вы должны управлять возвращенным ответом следующим образом:

void net::done(QNetworkReply * reply) {if (reply->error() == QNetworkReply::NoError)
{
data = QString(reply->readAll ());
}
else
{
data = QString(reply->errorString ());
}
}
1

Другие решения

Ваш экземпляр QNetworkAccessManager выходит из области видимости в конце вашего get_site функция. Согласно документации Qt, одного QNetworkAccessManager должно быть достаточно для всего приложения Qt. Ваш объект должен сохраняться вне области действия этой функции, поскольку, вероятно, ответ получит больше времени, чем потребуется для завершения этой функции. Сделайте QNetworkAccessManager членом вашего сетевого класса вместо автоматической переменной, локальной для get_site,

Обратите внимание, что вам также нужно управлять временем жизни объекта QNetworkReply, а не с помощью delete, но с помощью deleteLater() или вы можете потерять память.

0

По вопросам рекламы [email protected]