QNetworkAccessManager finished signal error
-
I want to download a token from server, I download files from the server before but this time the only change is the code is in a new header and source file.
updater.h :
#ifndef UPDATER_H #define UPDATER_H #include <QObject> #include <QNetworkReply> #include <QSettings> class Updater : public QObject { Q_OBJECT // Enable slots and signals public: Updater(); ~Updater(); private slots: void getTokenFinished(QNetworkReply* replay); private: void getToken(); void statusCheck(); QString token; QSettings settings; }; #endif // UPDATER_H
updater.cpp :
#include "updater.h" #include <QDebug> #include <QNetworkAccessManager> Updater::Updater() { this->getToken(); } Updater::~Updater() { } void Updater::getToken() { QNetworkAccessManager *manager = new QNetworkAccessManager(this); QNetworkRequest request; request.setUrl(QUrl("http://localhost/cdms/pro/index.php/update/token?version=3.14&" "lisenceRegis=1&onlineRegis=1&parishId=1")); request.setRawHeader("User-Agent", "MyOwnBrowser 1.0"); QNetworkReply *replay = manager->get(request); qDebug() << request.url(); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getTokenFinished(QNetworkReply*))); } void Updater::getTokenFinished(QNetworkReply* replay) { qDebug() << "finished"; // Checking replay if (replay->isReadable()) { // Checking errors if(replay->error() == QNetworkReply::NoError) { QByteArray strreplay = replay->readAll(); qDebug() << strreplay; if(strreplay != "0") { token = strreplay; qDebug() << token; } } } } void Updater::statusCheck() { }
php :
$token = "dfsdfs"; echo $token;
No error in build or running the code. finished signal isn't emitted or 'void Updater::getTokenFinished(QNetworkReply* replay)' didn't run.
-
You should connect the readyRead() and error() signals of QNetworkReply *replay.
Please see the documentation: http://doc.qt.io/qt-5/qnetworkaccessmanager.html
-
@mcosta I test the url on a browser and it worked, it's a LAMP server
environment : Qt 5.4.1, Ubuntu 12.04
the same code is run on main window class fine but I can't run the same network request on custom resource/header. I want to write the data updating section code on a different resource/header file.
-
Hi,
Any chance of having something like:
void MyCoolClass::getUpate() { Updater updater; updater.getToken(); }
?
-
@SGaist @mcosta I think I got a clue, In
void MyCoolClass::getUpate() { Updater updater; updater.getToken(); this->runUpdate(); }
if I run both then only 'this->runUpdate();' call will work if commented out 'this->runUpdate();' then 'updater.getToken();' works.
void MyCoolClass::runUpdate() { QNetworkAccessManager *manager = new QNetworkAccessManager(this); request.setUrl(QUrl("http://localhost/cdms/pro/index.php/update/linux?version=4.14&" "lisenceRegis=1&onlineRegis=1")); QNetworkReply *reply = manager->get(request); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); } void CDMS::replyFinished(QNetworkReply * replay) { // Checking replay if (replay->isReadable()) { // Checking errors if(replay->error() == QNetworkReply::NoError) { QByteArray strreplay = replay->readAll(); // update ststus check if(strreplay != "0") { } else { ui->statusBar->showMessage("No new updates found", 10000); // run update on intervel in 30Minute QTimer::singleShot(1800000, this, SLOT(updateOnlineTimer())); // Run update on data and settings //Updater updateCDMSdata; //updateCDMSdata.getToken(); } } else { ui->statusBar->showMessage(replay->errorString(), 10000); // run update on intervel in 1Minute QTimer::singleShot(60000, this, SLOT(updateOnlineTimer())); } } }
I want to call the 'Updater' when the 'runUpdate' download finished.
-
You create a local instance of Updater in this method:
void MyCoolClass::getUpate() { Updater updater; updater.getToken(); this->runUpdate(); }
As soon as this method finishes updater goes out of scope and is destroyed. That's why nothing is called. You must keep the instance until it finishes its work.
-
But now you have a memory leak: you do not delete updateCDMSdata
-
To add to @jsulm, what does runUpdate do ? Call a function on updateCDMSdata ? If so you are lucky id doesn't crash.
If you will be using Updater several times then make it a member of your MyCoolClass object and don't forget to handle its deletion.
-
@SGaist , runUpdate used to update the software and updateCDMSdata used to update data. I want to run data update when there is no software update, first check software update then from the 'finished(QNetworkReply*)' signal data update started.
I need to call updater several times, so I think use Updater as a member and delete on MyCoolClass::~MyCoolClass() is a better idea ?
-
Since it's a QObject you can use the parent/child paradigm to let Qt handle the deletion for you.