QSignalMapper beispiel für nicht ui signals gesucht

Alles rund um die Programmierung mit Qt
Antworten
geostein8888
Beiträge: 50
Registriert: 16. März 2011 08:25

QSignalMapper beispiel für nicht ui signals gesucht

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Jeder NetWorkRequest bekommt eine eindeutige Idee mit der man später die Zuordnung wieder machen kann. QSignalMapper braucht man dazu nicht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
geostein8888
Beiträge: 50
Registriert: 16. März 2011 08:25

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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!
geostein8888
Beiträge: 50
Registriert: 16. März 2011 08:25

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
geostein8888
Beiträge: 50
Registriert: 16. März 2011 08:25

Beitrag 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
geostein8888
Beiträge: 50
Registriert: 16. März 2011 08:25

Beitrag 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
Antworten