我正在使用Qt 5.4版用C++编写一个程序。我需要使用http请求并使用类QNetworkAccessManager
、QNetworkReply
、QNetworkRequest
、QUrl
从网站检索数据。我看到了关于这个问题的不同帖子,但找不到任何解决问题的方法。
这是标题的代码: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")));
如果你解决了这些问题,我认为你的错误就会得到解决。