Seite 1 von 2

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

Verfasst: 29. November 2006 02:27
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.

Verfasst: 29. November 2006 10:37
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

Verfasst: 29. November 2006 11:33
von Christian81
keine ahnung was readAll() an der Stelle überhaupt soll...

Verfasst: 29. November 2006 18:20
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.

Verfasst: 29. November 2006 18:29
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:

Verfasst: 1. Dezember 2006 17:56
von joebar
Darf man keine Frage stellen wenn man Probleme mit der Doku hat?

Verfasst: 1. Dezember 2006 18:05
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!

Verfasst: 1. Dezember 2006 22:12
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.

Verfasst: 2. Dezember 2006 00:18
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.

Verfasst: 2. Dezember 2006 02:45
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.

Verfasst: 2. Dezember 2006 13:52
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

Verfasst: 2. Dezember 2006 14:28
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();

Verfasst: 3. Dezember 2006 01:38
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.

Verfasst: 3. Dezember 2006 09:15
von upsala
Keine Ahnung, aber du könntest ja mal mit ethereal nachschauen was passiert...

Verfasst: 3. Dezember 2006 09:32
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() ...