Я пытаюсь получить веб-страницу с помощью 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
В вашем коде есть несколько серьезных проблем. Сначала вы должны иметь 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 ());
}
}
Ваш экземпляр QNetworkAccessManager выходит из области видимости в конце вашего get_site
функция. Согласно документации Qt, одного QNetworkAccessManager должно быть достаточно для всего приложения Qt. Ваш объект должен сохраняться вне области действия этой функции, поскольку, вероятно, ответ получит больше времени, чем потребуется для завершения этой функции. Сделайте QNetworkAccessManager членом вашего сетевого класса вместо автоматической переменной, локальной для get_site
,
Обратите внимание, что вам также нужно управлять временем жизни объекта QNetworkReply, а не с помощью delete
, но с помощью deleteLater()
или вы можете потерять память.