Wer sendet void requestFinished ( int id, bool error )?

Alles rund um die Programmierung mit Qt
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Wer sendet void requestFinished ( int id, bool error )?

Beitrag von joebar »

Hallo,

folgender Code:

Code: Alles auswählen

#include "testapp.h"
#include <QtGui>
#include <QtCore>
#include <QHttp>

void TestApp::httpRequestFinished(int requestId, bool error){
        qDebug() << "finished";
	if (httpRequestAborted){
		qDebug() << "Request Aborted";
		return;
	}
	
	if (requestId != httpGetId){
	qDebug() << "Wrong Request ID";
	return;
	}
	
	if (error){
		QMessageBox::information(this, tr("HTTP"),tr("Download failed: %1.").arg(http->errorString()));
	} 
	else{
		qDebug() << "geladen";
	}
}


TestApp::TestApp(QDialog *parent) : QDialog(parent)
{
setupUi(this);
http = new QHttp(this);
connect(okButton, SIGNAL (clicked()), this, SLOT(slotClose()));
connect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(httpRequestFinished(int, bool)));
httpRequestAborted = false;

http->setHost("www.trolltech.com"); 
httpGetId = http->get("/index.html"); 
http->readAll();
qDebug() << "los gehts";
}

TestApp::~TestApp()
{}

void TestApp::slotClose()
{

accept();
}

Ich wuerde erwarten, dass readAll() irgendwan das Signal requestFinished() ruft. Steht zwar nicht so direkt in der Doku, aber ich meine dies dem Beispiel code von Trolltech zu entnehmen. Das Signal wird aber nie gerufen. Wird es generell von readAll() nicht gerufen?

Danke,
J.
flownfluid
Beiträge: 80
Registriert: 6. Januar 2005 12:54

Beitrag von flownfluid »

Habe das noch nie gebraucht, aber in der Doku wird geschrieben:
The readyRead() signal tells you that there is data ready to be read. The amount of data can then be queried with the bytesAvailable() function and it can be read with the read() or readAll() functions.

If an error occurs during the execution of one of the commands in a sequence of commands, all the pending commands (i.e. scheduled, but not yet executed commands) are cleared and no signals are emitted for them.
Denke mal das mit readAll() irgendwo ein Fehler auftritt und so kein Signal aufgerufen wird.

Gruss
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

keine ahnung was readAll() an der Stelle überhaupt soll...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Aeh, bin verwirrt. Nachdem ich alle Parameter gesetzt habe muss ich meinem Programm doch irgendwie sagen "so und jetzt lese auch die Daten von der URL". Wie mache ich das denn wenn nicht per readAll()?

was readyRead() angeht, das ist so eine Sache. readyRead() gibt mir an wenn die Daten da sind, das requestFinished(int, bool) aber auch. Hier ist mir nicht ganz klar was wozu da ist, bzw. wo der Unschied ist.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Manchmal frage ich mich echt wozu die DOKU da ist... nicht das dort ein Beispiel wäre bei dem alles mögliche erklärt wird. :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Darf man keine Frage stellen wenn man Probleme mit der Doku hat?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

joebar hat geschrieben:Darf man keine Frage stellen wenn man Probleme mit der Doku hat?
Natürlich. Aber ein wenig Grundvorraussetzungen sollte man schon haben bevor man Fragen stellt - und wenn ein einfaches Beispiel in der Doku steht finde ich, man hat sich die Dokuu nicht genau angschaut... alles vorkauen macht absolut keinen Sinn!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

sorry dass ich so doof bin das einfache beispiel zu verstehen. wie waers mit einer Rubrik fuer Anfaengerfragen? Bin gerne bereit da zu posten wenn ich mich dann nicht anpflaumen lassen muss.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich glaube Du hast mich falsch verstanden. Ich habe nichts gegen Anfängerfragen. Ich finde nur dass ein wenig Eigeninitiative nötig ist um etwas zu verstehen.
Wenn man etwas nicht versteht, gibt es (meistens) Qt-Beispiele
-> \examples\network\http
Dort sieht man imho schön wie ein request gestartet wird und wie auf das Signal requestFinished() reagiert wird. Wenn man dann etwas nicht versteht kann man getrost fragen. So ist man auch sicher dass der andere den gleichen Sourcecode hat.

Da Du z.B. deinen Header nicht gepostet hast, weiss man nicht ob TestApp::httpRequestFinished() als Slot definiert ist, ob Du ggf. Q_OBJECT vergessen hast, usw. Dein Sourcecode sieht nämlich ansonsten ok aus.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Das mit der Eigeninitiative sehe ich genauso. Schoen, dass du das Beispiel erwaehnst, genau darauf basiert mein Sourcecode, vergleich sie mal. Meiner ist allerdings etwas verkuerzt damit ich besser durchblicke - okay hat bisher noch nicht geholfen...

Hier meine header datei:

Code: Alles auswählen

#ifndef TESTAPP_H
#define TESTAPP_H

#include "ui_testapp.h"

#include <QtGui>
#include <QtCore>

class QHttp;

class TestApp : public QDialog, public Ui::TestApp{
Q_OBJECT

public:
	TestApp (QDialog *parent = 0);
	~TestApp();
private slots:
	void slotClose();
	void TestApp::httpRequestFinished(int, bool);
private:
	int httpGetId;
	bool httpRequestAborted;
	QHttp *http;
};

#endif //TESTAPP_H
Und im Anhang das ganze Paket.
Dateianhänge
http.tar.gz
(3.49 KiB) 136-mal heruntergeladen
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Nach der Fehlerkorrektur erscheint:
los gehts
finished
Wrong Request ID
finished
geladen
Fehler:
statt
void TestApp::httpRequestFinished(int, bool);
muss es
void httpRequestFinished(int, bool);
heissen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Außerdem würde ich im Header:
QBuffer m_buffer;
hinzufügen;

Alle readAll weglassen;

Das get-Kommando umschreiben:
httpGetId->http->get("/index.html", &m_buffer);

Und nach
qDebug() << "geladen";
das hinzufügen:
qDebug() << m_buffer.data();
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

supi, klappt. danke.

Eins ist mir aber nicht klar. Bei mir ist IMMER erst einmal ein requestFinished mit der falschen ID, warum ist das so?

In der Doku steht was von

Code: Alles auswählen

requestStarted(1)
    requestFinished(1, false)

    requestStarted(2)
    stateChanged(Connecting)
    stateChanged(Sending)
    dataSendProgress(77, 77)
    stateChanged(Reading)
    responseHeaderReceived(responseheader)
    dataReadProgress(5388, 0)
    readyRead(responseheader)
    dataReadProgress(18300, 0)
    readyRead(responseheader)
    stateChanged(Connected)
    requestFinished(2, false)

    done(false)

    stateChanged(Closing)
    stateChanged(Unconnected)
Das lese ich so:
1. Zeile: starte Request
2. Zeile: Rquest fertig, kein Fehler

Aber was fuer Request und Signale kommen noch danach? soll ich das so verstehen, dass das setzen des Hostnames auch schon einen Request ausloest? Und das dann bei mir der mit der falschen Id ist? Falls diese Vermutung richtig ist, warum wird beim setzen eines Hostnames ein Request uebers Netz geschickt? Macht das Sinn?

danke,
J.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Keine Ahnung, aber du könntest ja mal mit ethereal nachschauen was passiert...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Doku:

Code: Alles auswählen

http->setHost("www.trolltech.com"); // id == 1
http->get("/index.html");           // id == 2
Steht also alles da... id 1 ist für setHost(), id 2 für get() ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten