Передайте QCoreApplication в параметре

Я пытаюсь построить клиент для веб-службы. Моя цель состоит в том, чтобы отправлять запрос на мой сервер каждую секунду. Я использовал эту библиотеку, чтобы помочь мне: QHttp

Я создаю таймер, который я связываю с сигналом к ​​моему QCoreApplication appи отправить мой запрос, когда таймер достигнет 1 секунды.

Вот как я это делаю :

main.cpp

#include "request.h"
int main(int argc, char** argv) {

QCoreApplication app(argc, argv);
Request* request = new Request();
request->sendRequestPeriodically(1000, app);return app.exec();
}

request.h

//lots of include before
class Request
{
Q_OBJECT

public:
Request();
void sendRequestPeriodically (int time, QCoreApplication app);

public slots:
void sendRequest (QCoreApplication app);

};

request.cpp

#include "request.h"
void Request::sendRequest (QCoreApplication app){
using namespace qhttp::client;
QHttpClient client(&app);
QUrl        server("http://127.0.0.1:8080/?Clearance");

client.request(qhttp::EHTTP_GET, server, [](QHttpResponse* res) {
// response handler, called when the incoming HTTP headers are ready// gather HTTP response data (HTTP body)
res->collectData();

// when all data in HTTP response have been read:
res->onEnd([res]() {
// print the XML body of the response
qDebug("\nreceived %d bytes of http body:\n%s\n",
res->collectedData().size(),
res->collectedData().constData()
);

// done! now quit the application
//qApp->quit();
});

});

// set a timeout for the http connection
client.setConnectingTimeOut(10000, []{
qDebug("connecting to HTTP server timed out!");
qApp->quit();
});
}

void Request::sendRequestPeriodically(int time, QCoreApplication app){
QTimer *timer = new QTimer(this);
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(sendRequest(app)));
timer->start(time); //time specified in ms
}

Request::Request()
{

}

Я получил эти ошибки:

C:\Qt\5.7\mingw53_32\include\QtCore\qcoreapplication.h:211: erreur : 'QCoreApplication::QCoreApplication(const QCoreApplication&)' is private
Q_DISABLE_COPY(QCoreApplication)

C:\Users\ebelloei\Documents\qhttp\example\client-aircraft\main.cpp:7: erreur : use of deleted function 'QCoreApplication::QCoreApplication(const QCoreApplication&)'

Я новичок в Qt, но я предполагаю, что это происходит из-за того, что я не могу передать свое QCoreApplication в параметрах, верно?

0

Решение

Прежде всего, если вам нужен доступ к глобальному экземпляру приложения, вы не должны передавать его. Использовать qApp макрос или QCoreApplication::instance(),

Но это не главное: QHttpClient client Экземпляр — это локальная переменная, время жизни которой управляется компилятором. Нет смысла давать его родителю. client уничтожается прямо как sendRequest выходы: ваш sendRequest из-за этого фактически не работает.

У вас также есть ошибки в вашем connect утверждения: вы не можете передавать значения аргументов, используя старый стиль connect синтаксис:

// Wrong: the connection fails and does nothing.
connect(timer, SIGNAL(timeout()), this, SLOT(sendRequest(foo)));
// Qt 5
connect(timer, &QTimer::timeout, this, [=]{ sendRequest(foo); });
// Qt 4
this->foo = foo;
connect(timer, SIGNAL(timeout()), this, SLOT(sendRequest()));
// sendRequest would then use this->foo

В идеале, вы должны изменить свой код для использования QNetworkAccessManager, Если нет, то вы должны сохранить QHttpClient экземпляр живой внутри main:

int main(int argc, char** argv) {
QCoreApplication app(argc, argv);
qhttp::client::QHttpClient client;
auto request = new Request(&client);
request->sendRequestPeriodically(1000);
return app.exec();
}

А потом:

class Request : public QObject
{
Q_OBJECT
QTimer m_timer{this};
qhttp::client::QHttpClient *m_client;
public:
explicit Request(qhttp::client::QHttpClient *client);
void sendRequestPeriodically(int time);
void sendRequest();
};

Request::Request(qhttp::client::QHttpClient *client) :
QObject{client},
m_client{client}
{
QObject::connect(&m_timer, &QTimer::timeout, this, &Request::sendRequest);
}

void Request::sendRequestPeriodically(int time) {
timer->start(time);
}

void Request::sendRequest() {
QUrl server("http://127.0.0.1:8080/?Clearance");

m_client->request(qhttp::EHTTP_GET, server, [](QHttpResponse* res) {
...
});
}
4

Другие решения

Вы не можете передать объект QCoreApplication копии через его конструктор копирования, вы должны передать указатель на QCoreApplication.

Все «QCoreApplication app» следует заменить на «QCoreApplication * app», и вызовы этих функций должны включать указатель на приложение, а не его копию.

request.h

//lots of include before
class Request
{
Q_OBJECT

public:
Request();
void sendRequestPeriodically (int time, QCoreApplication *app);

public slots:
void sendRequest (QCoreApplication *app);

};

request.cpp

#include "request.h"
void Request::sendRequest (QCoreApplication *app){
using namespace qhttp::client;
QHttpClient client(app);
QUrl        server("http://127.0.0.1:8080/?Clearance");

client.request(qhttp::EHTTP_GET, server, [](QHttpResponse* res) {
// response handler, called when the incoming HTTP headers are ready// gather HTTP response data (HTTP body)
res->collectData();

// when all data in HTTP response have been read:
res->onEnd([res]() {
// print the XML body of the response
qDebug("\nreceived %d bytes of http body:\n%s\n",
res->collectedData().size(),
res->collectedData().constData()
);

// done! now quit the application
//qApp->quit();
});

});

// set a timeout for the http connection
client.setConnectingTimeOut(10000, []{
qDebug("connecting to HTTP server timed out!");
qApp->quit();
});
}

void Request::sendRequestPeriodically(int time, QCoreApplication app){
QTimer *timer = new QTimer(this);
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(sendRequest(app)));
timer->start(time); //time specified in ms
}

Request::Request()
{

}

main.cpp

#include "request.h"
int main(int argc, char** argv) {

QCoreApplication app(argc, argv);
Request* request = new Request();
request->sendRequestPeriodically(1000, &app);

return app.exec();
}

редактировать
Как сказал КубаОбер, в вашем коде больше проблем, прочитайте его ответ

1

По вопросам рекламы [email protected]