Я хочу получить строку, которая появляется по следующей ссылке в моей программе Qt, как я могу ее получить?
http://en.wikipedia.org/w/api.php?action=opensearch&search=centaurus_constellation
Я закодировал следующие файлы, чтобы получить строку, показанную на вышеприведенной странице, в m_DownloadedData, но она хранит пустую строку в конце программы, может ли кто-нибудь помочь мне получить данные из вышеуказанной ссылки?
.h файл:
#ifndef SKYOBJDESCRIPTION_H
#define SKYOBJDESCRIPTION_H
#include <QObject>
#include <QByteArray>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
class SkyObjDescription : public QObject
{
Q_OBJECT
public:
explicit SkyObjDescription(const QString soName, const QString soType, QObject* parent = 0);
virtual ~SkyObjDescription();
QByteArray downloadedData() const;
signals:
void downloaded();
private slots:
void fileDownloaded(QNetworkReply* reply);
private:
QString soName,soType;
QByteArray m_DownloadedData;
};
#endif // SKYOBJDESCRIPTION_H
и.cpp файл
#include <QString>
#include <QUrl>
#include <QDebug>
#include "skyobjdescription.h"
SkyObjDescription::SkyObjDescription(const QString so_Name, const QString so_Type, QObject* parent): soName(so_Name), soType(so_Type), QObject(parent)
{
QString wikiLink = "http://en.wikipedia.org/w/api.php?action=opensearch&search="+ soName.replace(" ", "_").toLower() + "_" + soType.toLower() + "&format=xml&limit=1.xml";
// QUrl wikiUrl("http://en.wikipedia.org/w/api.php?action=opensearch&search=hello_world&format=xml&limit=1.xml");
m_DownloadedData = wikiUrl.toEncoded();
qDebug() << "wikiUrl.toEncoded(): " << m_DownloadedData;
QNetworkRequest req(wikiUrl);
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(fileDownloaded(QNetworkReply*)));
manager->get(req);
}
SkyObjDescription::~SkyObjDescription()
{
}
void SkyObjDescription::fileDownloaded(QNetworkReply* reply)
{
m_DownloadedData = reply->readAll();
qDebug() << "received reply";
qDebug() << m_DownloadedData;
reply->deleteLater();
emit downloaded();
}
QByteArray SkyObjDescription::downloadedData() const
{
qDebug() << m_DownloadedData;
return m_DownloadedData;
}
часть main.cpp
SkyObjDescription * skd = new SkyObjDescription(m_Name, "Constellation");
QString data(skd->downloadedData());
qDebug() << data;
delete skd;
Если есть другой способ получить данные из ссылки, пожалуйста, объясните это. Большое спасибо :)
Вероятно, эксперимент вызван двойным вызовом QNetworkReply::readAll
.
Помнит, что это операция ввода-вывода, и нет возможности многократно считывать информацию, содержащуюся в ответе netwrk.
Просто прокомментируйте свою строку отладки:
void SkyObjDescription::fileDownloaded(QNetworkReply* pReply)
{
//qDebug() << pReply->readAll();
m_DownloadedData = pReply->readAll();
//emit a signal
pReply->deleteLater();
emit downloaded();
}
редактировать (для полноты)
Код проверки, который я использую:
#ifndef TMP_H
#define TMP_H
#include <QObject>
class QNetworkReply;
class Tmp : public QObject
{
Q_OBJECT
public:
explicit Tmp(QObject *parent = 0);
signals:
public slots:
void displayResult(QNetworkReply* reply);
};
#endif // TMP_H
//tmp.cpp
#include "tmp.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QDebug>
Tmp::Tmp(QObject *parent) :
QObject(parent)
{
QUrl url("http://en.wikipedia.org/wiki/Centaurus_constellation");
QNetworkRequest req(url);
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(displayResult(QNetworkReply*)));
manager->get(req);
}
void Tmp::displayResult(QNetworkReply *reply) {
QByteArray buffer = reply->readAll();
qDebug() << "received reply";
qDebug() << buffer;
reply->deleteLater();
}