1

I am writing a program in C++ using Qt version 5.4. I need to retrieve data from a website using http request and using the classes QNetworkAccessManager, QNetworkReply, QNetworkRequest, QUrl. I saw the different posts about this question but could not find any solution to my problem .

Here is the code of the header :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

Here is the code of the 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());
}

Here is the code of the main .cpp

#include "fenetreprincipal.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    fenetrePrincipal w;
    w.show();

    return a.exec();
}

Here are the errors :

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());
                          ^

Can you help me identify and rectify the errors?

The goal is to create an app that shows the rates of different currencies. The rates are the data I need to retrieve and download in a file.

3
  • what happen if you remove class QNetworkReply; ? Commented Mar 27, 2015 at 9:31
  • invalid use of incomplete type 'class QNetworkReply', for this you need to include QNetworkReply header Commented Mar 27, 2015 at 9:35
  • reply = manager->get(request()); -> you have void request() function, you need to create instance of QNetworkRequest Commented Mar 27, 2015 at 9:37

1 Answer 1

1

I think you have two issue with your code.

1) You forward declared QNetworkReply class, but never included header, so you are facing following error.

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

include header below,

#include <QtNetwork/QNetworkReply>

2) QNetworkManager::get() accepts QNetworkRequest object, you called your own void request() function here.

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

you should do something like,

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

If you resolve these issues, I think your error will be resolved.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.