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

标签 c++ qt

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

这是 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

这是 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 类,但从未包含 header ,因此您面临以下错误。

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")));

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

关于c++ - 通过 HTTP 请求从站点检索数据(使用 QT5.4 的 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296997/

相关文章:

c++ - 如何在 macbookpro 上的 makefile 中包含 GLUI 框架?

c++ - OpenCV 中 meanShiftFiltering 和 meanShiftSegmentation 的区别

android - 如何在 Android 的 QML WebView 中启用 LocalStorage?

python - pyside QTextEdit 选定文本事件

c++ - QWidget paintEvent 无故停止调用

c++ - 为什么我收到此错误 : constexpr' is not valid here

c++ - std::list 的新位置

c++ - QThread和notify的实现

c++ - C++与QML之间的通信

Qt - 在 QWidget 中滚动文本