c++ - QNetworkRequest (HTTP GET) doesn't fire, after refactoring into a standalone class -
i've began tedious process of modularising large, monolithic audio player application wrote 2 months ago.
this process going reasonably well, although appears 1 of methods (scrobblemedia - predictably enough makes http requests submit information playing track last.fm) no longer seems make network requests.
however, qurl object passed through qnetworkaccessmanager instance/qnetworkrequest being built correctly.
for comparison, functional mercurial revision of code available on bitbucket.
the scrobblemedia method looks this, after refactoring:
#include "scrobblemedia.h" #include <qdebug> #include <cstdio> scrobblemedia::scrobblemedia(qstring asusername, qstring aspassword, qstring asartist, qstring astrack, qstring asalbum) { qstring kendpointurl = "http://lastfmstats.livefrombmore.com/universalscrobbler/scrobble.php"; qurl iscrobbleendpoint(kendpointurl); qnetworkaccessmanager *iscrobbledispatcher = new qnetworkaccessmanager(this); iscrobbleendpoint.addqueryitem("submissiontype","track"); iscrobbleendpoint.addqueryitem("username", asusername); iscrobbleendpoint.addqueryitem("password", aspassword); iscrobbleendpoint.addqueryitem("artist", asartist); iscrobbleendpoint.addqueryitem("track", astrack); iscrobbleendpoint.addqueryitem("album", asalbum); iscrobbleendpoint.addqueryitem("number","1"); iscrobbleendpoint.addqueryitem("duration","200"); iscrobbledispatcher->get(qnetworkrequest(iscrobbleendpoint)); connect(iscrobbledispatcher, signal(finished(qnetworkreply*)), slot(replyfinished(qnetworkreply*))); // qstring outside = iscrobbleendpoint.toencoded(); qdebug() << "received: " + asusername + " " + aspassword + " " + asartist + " " + astrack + " " + asalbum; qdebug() << iscrobbleendpoint.tostring(); } scrobblemedia::~scrobblemedia() { }
the associated header file looks like:
#ifndef scrobblemedia_h #define scrobblemedia_h #include <qstring> #include <qtnetwork> #include <qurl> #include <qnetworkaccessmanager> class scrobblemedia : public qobject { q_object; private: public: scrobblemedia(qstring asusername, qstring aspassword, qstring asartist, qstring astrack, qstring asalbum); ~scrobblemedia(); }; #endif // scrobblemedia_h
i'm building application against mingw build of version 4.7.0 of qt libraries (included part of qt sdk 2010.05) under windows 7 x86-64.
any assistance appreciated.
thanks in advance.
after reading number of different sources of information (most of contradictory), i've found following results in working solution - albeit cosmetic issue in debugging output doesn't seem affect operation (object::connect: no such signal qnetworkreplyimpl::finished(qnetworkreply*) in ../audioplayer/scrobblemedia.cpp:29
):
in scrobblemedia.cpp
:
#include "scrobblemedia.h" #include <qdebug> #include <cstdio> scrobblemedia::scrobblemedia(qstring asusername, qstring aspassword, qstring asartist, qstring astrack, qstring asalbum) { qbytearray idatasink; qeventloop iloop; qstring kendpointurl = "http://lastfmstats.livefrombmore.com/universalscrobbler/scrobble.php"; qurl iscrobbleendpoint(kendpointurl); iscrobbleendpoint.addqueryitem("submissiontype","track"); iscrobbleendpoint.addqueryitem("username", asusername); iscrobbleendpoint.addqueryitem("password", aspassword); iscrobbleendpoint.addqueryitem("artist", asartist); iscrobbleendpoint.addqueryitem("track", astrack); iscrobbleendpoint.addqueryitem("album", asalbum); iscrobbleendpoint.addqueryitem("number","1"); iscrobbleendpoint.addqueryitem("duration","200"); qnetworkaccessmanager iscrobbledispatcher; qnetworkrequest iscrobblerequest(iscrobbleendpoint); qnetworkreply *iscrobblereply = iscrobbledispatcher.get(iscrobblerequest); qobject::connect(iscrobblereply, signal(finished(qnetworkreply*)), &iloop, slot(quit())); idatasink = iscrobblereply->readall(); qdebug() << "received: " + asusername + " " + aspassword + " " + asartist + " " + astrack + " " + asalbum; qdebug() << iscrobbleendpoint.tostring(); iloop.exec(); } scrobblemedia::~scrobblemedia() { } void scrobblemedia::replyfinished(qnetworkreply*) { } void scrobblemedia::reallydone() { qdebug() << "we've scrobbled..."; }
in scrobblemedia.h
:
#ifndef scrobblemedia_h #define scrobblemedia_h #include <qstring> #include <qtnetwork> #include <qurl> #include <qnetworkaccessmanager> class scrobblemedia : public qobject { q_object private: public: scrobblemedia(qstring asusername, qstring aspassword, qstring asartist, qstring astrack, qstring asalbum); ~scrobblemedia(); private slots: void replyfinished(qnetworkreply*); void reallydone(); }; #endif // scrobblemedia_h
thanks help.
hopefully code serve useful template others, in future.
Comments
Post a Comment