Qt4 - Problem mit eigener HTTP-Klasse

Alles rund um die Programmierung mit Qt
Antworten
caligano
Beiträge: 126
Registriert: 19. August 2006 15:33

Qt4 - Problem mit eigener HTTP-Klasse

Beitrag von caligano »

Hallo!

Ich mir in Qt4 eine kleine HTTP-Klasse gebaut, um mir in einem Programm, das oft gleichartige HTTP-Requests an den gleichen Host sendet, ein bisschen Code-Wiederholung zu sparen.

Das ganze sieht so aus:
http.h

Code: Alles auswählen

#ifndef HTTP_H
#define HTTP_H

#include <QHttp>

class QHttpRequestHeader;

class Http : public QHttp
{
   Q_OBJECT
   
public:
   Http(QObject *parent);
   void setHeader(const QString &method, const QString &path, const QString &cookie);
   void sendRequest();

private:
   QHttpRequestHeader header;   
};
        
#endif
http.cpp

Code: Alles auswählen

#include <QHttp>
#include <QHttpRequestHeader>
#include <QByteArray>
#include <QString>

#include "http.h"

Http::Http(QObject *parent = 0) : QHttp(parent) {}

void Http::setHeader(const QString &method, const QString &path, const QString &cookie = "")
{
 header.setRequest(method, path);
 header.setValue("Host", "www.host.de");
 header.setValue("Content-type","application/x-www-form-urlencoded");
 header.setValue("Keep-Alive", "300");
 header.setValue("Connection", "keep-alive"); 
 
 if (cookie!="")
 {
  	 header.setValue("Cookie", cookie);
 }

 
}

void Http::sendRequest()
{
   this->setHost("www.host.de");
   this->request(header);

}
verwendet wird die Klasse Http z.B in : mainwindow.cpp

Code: Alles auswählen

 MainWindow::MainWindow()
{
   http = new Http(this);	
   connect(http, SIGNAL(done(bool)),this, SLOT(displayText(bool)));
   ...
}
Das funktioniert , doch wenn ich z.B. this->setHost("www.host.de"); in den Konstruktor Http::Http schreibe, anstatt diesen Befehl z.B erst in Http::sendRequest() aufzurufen, tritt folgender Fehler auf:

Sofort nach dem Starten des Programm wird die Funktion displayText() aufgerufen (Fenster geht auf, aber natürlich ohne Inhalt). Dann gibt man Daten ein, ein paar Requests werden gesendet, und das Fenster geht nochmal auf, diesmal mit Inhalt.
Wird die connect-Zeile auskommentiert, geht kein Fenster auf, auch nicht das erste gleich nach dem Programmstart.
Daraus schließe ich, dass die Klasse Http sofort beim konstruieren das Signal "done()" aussendet (bei "requestFinished" passiert übrigens das gleiche!).

Ich steh gerade ziemlich aufm Schlauch, warum darf ich im Konstruktor z.B. kein this->setHost() ausführen?

Danke schon mal im Voraus,
caligano
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Beitrag von gerome69 »

Wenn das Signal "done()" gewissermassen viel zu früh abgesendet wird, wie du beschreibst:
done() schickt doch eine boolsche Variable mit. Hat die immer den gleichen Wert zum "richtigen" und zum "falschen" Zeitpunkt?

Gruß, Bernd
caligano
Beiträge: 126
Registriert: 19. August 2006 15:33

Beitrag von caligano »

ja, es wird sozusagen immer done(false) abgeschickt (false = kein Fehler beim HTTP-Request )
Antworten