通过HTTP请求从站点检索数据(使用QT5.4的C++)



我正在使用Qt 5.4版用C++编写一个程序。我需要使用http请求并使用类QNetworkAccessManagerQNetworkReplyQNetworkRequestQUrl从网站检索数据。我看到了关于这个问题的不同帖子,但找不到任何解决问题的方法。

这是标题的代码:fenetreApplication.h

#ifndef FENETREPRINCIPAL_H
#define FENETREPRINCIPAL_H
#include <QMainWindow>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QUrl>
#include <QString>
class QFile;
class QNetworkReply;

namespace Ui {
class fenetrePrincipal;
}
class fenetrePrincipal : public QMainWindow
{
    Q_OBJECT
public:
    explicit fenetrePrincipal(QWidget *parent = 0);
    ~fenetrePrincipal();
    void request();
private slots:
    void downloadFile();
    void cancelDownload();
    void httpFinished();
    void httpReadyRead();

private:
    Ui::fenetrePrincipal *ui;
       QUrl url;
       QNetworkAccessManager *manager;
       QNetworkRequest requete;
       QNetworkReply *reply;
       QFile *file;
       int httpGetId;
       bool httpRequestAborted;
};
#endif // FENETREPRINCIPAL_H

以下是cpp:fenetreApplication.cpp 的代码

#include <QtWidgets>
#include <qnetwork.h>
#include <QString>
#include "fenetreprincipal.h"
#include "ui_fenetreprincipal.h"
fenetrePrincipal::fenetrePrincipal(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::fenetrePrincipal)
{
    ui->setupUi(this);
}
fenetrePrincipal::~fenetrePrincipal()
{
    delete ui;
}
void fenetrePrincipal::request()
{
    manager =  new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(httpFinished(QNetworkReply*)));
    requete.setUrl(QUrl("http://fxrates.fr.forexprostools.com/index.php?force_lang=5&pairs_ids=1;3;2;4;7;5;8;6;&header-text-color=%23FFFFFF&curr-name-color=%230059b0&inner-text-color=%23000000&green-text-color=%232A8215&green-background=%23B7F4C2&red-text-color=%23DC0001&red-background=%23FFE2E2&inner-border-color=%23CBCBCB&border-color=%23cbcbcb&bg1=%23F6F6F6&bg2=%23ffffff&bid=show&ask=show&last=show&change=hide&change_in_percents=hide&last_update=show"));
    reply = manager->get(request());
connect(reply, SIGNAL(readyRead()), this, SLOT(httpReadyRead()));
}
void fenetrePrincipal::downloadFile()
{
    QFileInfo fileInfo(url.path());
    QString fileName = fileInfo.fileName();
    if (fileName.isEmpty())
        fileName = "index.html";
    if (QFile::exists(fileName)) {
    file = new QFile(fileName);
    if (!file->open(QIODevice::WriteOnly)) {
        delete file;
        file = 0;
        return;
    }

    // schedule the request
    httpRequestAborted = false;
    request();
}

void fenetrePrincipal::httpFinished()
{
    if (httpRequestAborted) {
        if (file) {
            file->close();
            file->remove();
            delete file;
            file = 0;
        }
        reply->deleteLater();
        return;
    }
    file->flush();
    file->close();
    reply->deleteLater();
    reply = 0;
    delete file;
    file = 0;
}

void fenetrePrincipal::httpReadyRead()
{
    // this slot gets called every time the QNetworkReply has new data.
    // We read all of its new data and write it into the file.
    // That way we use less RAM than when reading it at the finished()
    // signal of the QNetworkReply
    if (file)
        file->write(reply->readAll());
}

这是main .cpp 的代码

#include "fenetreprincipal.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    fenetrePrincipal w;
    w.show();
    return a.exec();
}

以下是错误:

IN function 'void fenetrePrincipal::request()':
invalid use of void expression
     reply = manager->get(request());

                               ^
no matching function for call to 'fenetrePrincipal::connect(QNetworkReply*&, const char*,

fenetrePrincipal*,const char*)'connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead[()]);^

In function 'void fenetrePrincipal::httpFinished()':
invalid use of incomplete type 'class QNetworkReply'
         reply->deleteLater();
              ^
erreur : forward declaration of 'class QNetworkReply'
 class QNetworkReply;
       ^

invalid use of incomplete type 'class QNetworkReply'
         file->write(reply->readAll());
                          ^

你能帮我识别并纠正错误吗?

目标是创建一个显示不同货币汇率的应用程序。费率是我需要在文件中检索和下载的数据。

我认为您的代码有两个问题。

1) 您转发声明了QNetworkReply类,但从未包含标头,所以您将面临以下错误。

erreur : forward declaration of 'class QNetworkReply'
 class QNetworkReply;

包括下面的标题,

#include <QtNetwork/QNetworkReply>

2) QNetworkManager::get()接受QNetworkRequest对象,您在这里调用了自己的void request()函数。

reply = manager->get(request());

你应该做一些类似的事情

manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

如果你解决了这些问题,我认为你的错误就会得到解决。

最新更新