Seite 1 von 1

QSignalMapper beispiel für nicht ui signals gesucht

Verfasst: 17. März 2011 12:22
von geostein8888
Hallo,
ich habe nun etwas rumgesucht konnte aber nur beispiele finden, welche auf button Clicks etc reagieren, habe versucht dies so umzusetzen dass ich es auch für meine bedürfnisse nutzen kann, leider aber ohne Erfolg.

das Problem:
ich schreibe eine Anwendung, welche per QNetworkAccessManager schrittweise daten von einem server über einzelne requests abholt. Da dies alles asynchron abläuft benötige ich hierzu ein signal/slot ding um die antworten den jeweiligen processmethoden zuzuordnen. Solange ich das ganze in einer Kette mache (ist a fertig initiiere requets b...) funktioniert das nur sobald mehrere request nacheinander gesendet werden (in einer Schleife z.b.) klappt das mit der verarbeitung nicht mehr.

Lösung:
QSignalMapper
nur bekomme ich das nicht hin, da alle beispiele auf signalen der ui basieren und ich nicht so recht verstehe, wie ich hier meine zuurdnung vom Aufruf zur Antwort hinbekommen kann

Georg

Verfasst: 17. März 2011 15:43
von Christian81
Jeder NetWorkRequest bekommt eine eindeutige Idee mit der man später die Zuordnung wieder machen kann. QSignalMapper braucht man dazu nicht.

Verfasst: 17. März 2011 16:42
von geostein8888
Hallo,
danke für diese Auskunft, gibt es denn irgend ein gutes Beipiel, wo man sich somas einmal anschauen kann (bie QT Creator habe ich sowas nicht direkt gefunden)

Georg

Verfasst: 17. März 2011 20:01
von solarix
Was Christian meint ist, dass dir
http://doc.qt.nokia.com/4.7/qnetworkacc ... l#finished
ja bereits mitteilt, welcher Request beendet wurde.. Also das, was du mit dem Mapper machen wolltest, bietet die Manager-Klasse ja bereits..

hth!

Verfasst: 18. März 2011 05:54
von geostein8888
habe mir die doku des networkmanager nochmal angeschaut, verstehe aber nicht wirklich wo der mir hier eine ID des calls zurückgibt (in finished)

gibt es hierzu vielleicht irgend eine deutsche Doku, in meinen Büchern gibt es den Manager nich nicht (den signalmapper auch nciht)

diese asynchron verbindung macht mich noch wahnsinnig

Georg

Verfasst: 18. März 2011 06:35
von Christian81
Gut dann eben keine IDs sondern Pointer auf QNetworkReply.

Code: Alles auswählen

QNetworkReply * QNetworkAccessManager::get ( const QNetworkRequest & request )
-->
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
 connect(manager, SIGNAL(finished(QNetworkReply*)),
         this, SLOT(replyFinished(QNetworkReply*)));

QNetworkReply  *reply = manager->get(QNetworkRequest(QUrl("http://qt.nokia.com")));
So hat jeder request einen Unique reply.

Verfasst: 18. März 2011 10:43
von geostein8888
Hallo,
ich stehe heir total auf dem schlauch, aber wie bekomme ich denn diesen reply pointer zurück?

das ganze war wie folgt geplanz:

in main

Code: Alles auswählen

wsReader->getData("headerdata","","");
QObject::connect(datahandler,SIGNAL(sigHeadersLoaded()),this, SLOT(slotTransferFinished()));
wsreader:

Code: Alles auswählen

void wsreader::getData(QString action, QString parameters, QString value){
    this->webUrl = "";
    if (parameters.length() > 0)
        parameters  = parameters;

    bool dataread = false;

    this->dataTypeAction=action;
    this->m_reply = NULL;
    QByteArray json = getJsonString(action,parameters,value);
    QString url = "http://"+this->props->getServerAdress()+"/msm_new/ws/ws.php?json="+json;
    this->webUrl = url;
    QTimer::singleShot(0,this,SLOT(doQuery()));
}
doQuery: (manager ist der QNetworkAcessManager

Code: Alles auswählen

void wsreader::doQuery(){
  QNetworkRequest req;
  QString url = this->webUrl;

  req.setUrl(QUrl(url));
  m_reply = manager->get(req);

  connect(manager,SIGNAL(finished(QNetworkReply*)), this, SLOT(handleDataFetched(QNetworkReply*)));

  connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleError(QNetworkReply::NetworkError)));
}
handledatafetched:

Code: Alles auswählen

void wsreader::handleDataFetched(QNetworkReply* reply){
  reply->dumpObjectInfo();
  QString data = reply->readAll();//m_reply
  this->jsonAnswerString = data;

  this->transferIsFinished = true;
  dataHandler->fillData(data,this->dataTypeAction);

  reply->deleteLater();
}
und hier wird dann eine methode aufgerufen, welche mir die json daten in hashtables abkegt zur späteren verarbeitung und dann

Code: Alles auswählen

emit sigHeadersLoaded();
das ganze an meine main als erledigt zurückfunkt.

über diese slots kann ich ja keine return values zurückgeben

Georg

Verfasst: 18. März 2011 13:32
von geostein8888
Hallo,
ich hab nun mein problem gelöst:
beim absenden des request generiere ich mir nun eine guid, welche ich in den reply objektnamen schreibe und diesen reiche ich dann zurück an main und in die andere richtung mittels des reply objektes durch bis zum emit

danke für die Hilfe

Georg