[C++ - Qt] QHttp stellt keine Funktion bereit einfach nur Seiten aufzurufen...

Kampfgnom

Lt. Commander
Registriert
Jan. 2005
Beiträge
1.075
Hi

Folgendes: Eine Seite im Internet hat ab und zu den Fehler dass man sich nicht einloggen kann. Ich möchte mich in einer while Schleife so lange einloggen bis ich wirklich drin bin:
Code:
while(nicht eingeloggt)
{            
        string page=post("foo.bar"  ,   "/login.php"  ,   "logindaten");
}
Diese post Funktion habe ich irgendwann mal geschrieben und ist ziemlich komplex.

Im Zuge einer Umstellung des Projektes auf Qt will ich nun die QHttp Klasse verwenden um Seiten aufzurufen. Da Qt jedoch mit SIGNALS und SLOTS arbeitet gibt es keine Funktion QString request(...).

Ich bin ein relativer Qt-Neuling. Kann mir einer sagen wie ich diese schleife hinkriege ohne gleich eine Internet-Klasse zu schreiben, die mir die SIGNALS von QHttp::request() abfängt?


Danke
 
Wenn ich hier nachschaue http://doc.trolltech.com/4.2/qhttp.html#request, dann gibt es sehr wohl zwei request()-Methoden.
Die liefert zwar keinen QString, aber halt einen "unique identifier" für diese Verbindung (oder so ähnlich).

Jetzt musst du nur noch die Signale requestStarted() und requestFinished() mit von dir zu schreibenden Slots verbinden und du kannst anhand dem Identifier erfragen welche Verbindung jetzt eigentlich gestartet oder beendet wurde.
Diese SLots können in einer eigenen Klasse von dir sein.

Wo war jetzt nochmal dein Problem?
 
nur malsone frage .. ich lese andauernd "Qt" aber was ist das eigentlich ?!
 
http://www.trolltech.com/products/qt

Qt ist eine Klassenbibliothek für die plattformübergreifende Programmierung grafischer Benutzeroberflächen unter C++. Qt wird besonders in den Bibliotheken des K Desktop Environments verwendet.

Qt wird von der norwegischen Firma Trolltech (früher Quasar Technologies) entwickelt, und ist für verschiedene Betriebssysteme bzw. Grafikplattformen wie X11 (Unix-Derivate), Mac OS X, Windows und als PDA-Version erhältlich. Neben der Entwicklung von grafischen Benutzeroberflächen bietet Qt umfangreiche Funktionen zur Internationalisierung sowie Datenbankfunktionen und XML-Unterstützung an.

Die Klassenbibliothek steht sowohl unter der GNU General Public License (GPL) als auch unter einer kommerziellen Lizenz, welche allerdings nur benötigt wird, falls mit der Umgebung Produkte entwickelt werden sollen, die nicht wiederum unter einer freien Lizenz stehen. (siehe Duales Lizenzsystem)

Qt verwendet eine Erweiterung der Programmiersprache C++. Es gibt auch Implementierungen für Python, Ruby, C, C#, Java und Perl, die allerdings nicht von Trolltech betreut werden.
Quelle: http://de.wikipedia.org/wiki/Qt_(Bibliothek)

Was Qt ist?
Qt ist einfach geil :).
 
Ja Qt ist in der Tat einfach nur toll :)

Aber ich finde dass die sich zu sehr auf ihr SIGNAL-SLOT Prinzip festgelegt haben. Dass man anders programmieren kann wissen die gar nicht mehr bei Trolltech...

Auf jeden Fall kann ich nicht so leicht die Funktion, in der die while Schleife steht, in eine Funktion und ein paar Slots zerlegen. Sie wird nämlich von einer anderen Klasse aufgerufen und gibt einen QString zurück (bisher std::string).

Ich brauche eine Funktion QString foo() die so lange eine Seite aufruft bis sie auch wirklich da ist und dann daraus einen Wert extrahiert und zurückgibt. Ich sehe irgendwie keine (einfache, simple) Möglichkeit das zu lösen mit Qt...


EDIT: Außerdem finde ich, dass Qt alles andere als "Klassenbibliothek für die plattformübergreifende Programmierung grafischer Benutzeroberflächen" ist. Qt kann ja wirklich nahezu alles. Vor allem das platformunabhängige Threading erspart einem die Arbeit alles für 3 Systeme zu schreiben ;)
 
Zuletzt bearbeitet:
Sry für Doppelpost. Ich machs der Übersicht halber.


So. Ich hab jetzt in den letzten Stunden vor dem Programm gesessen, fröhlich vor mich hingedacht, und bin zu dem Schluss gekommen, dass durch die Jahre, in denen das Teil immer wieder erweitert wurde, alles viel zu kompliziert geworden ist.

Ich habe morgen erst zur 6ten Stunde Schule und werde nun die Nacht mit dem Neuschreiben der betroffenen Klassen verbringen. Mit der Qt-Methode ist es dann im Endeffekt viel einfacher zu warten und verstehen...
 
Und das mein Herr, ist der Moment der Erkenntnis :).

Diese "Festlegung" auf das Signal-Slot-Konzept, was von vielen Leuten, die mit Qt wenig bis nichts zu tun haben, sehr kritisiert wird, ist genau der Punkt, der den Umgang mit Qt so einfach macht.

Ein Signal ja genau genommen nicht anderes als ein lustiger kleiner Kerl, der dir irgendwas wichtige mitteilen will.
Ein anderer Kerl, mit dem netten Namen "Slot" hat den Auftrag aufzupassen bist der Kerl mit Namen "Signal" ihm etwas zubrüllt. Und dann reagiert Slot und macht das was als Reaktion auf das Signal vorgesehen ist.

Du kannst einen Slot aber auch wie eine normale Methode benutzen. Kein Problem. Aber er hat halt noch die besondere Fähigkeit auf ein Signal reagieren zu können.

Dieses Prinzip ist meiner Meinung nach den Callback-Funktionen anderer Bibliotheken deutlich überlegen.
 
Hey sorry, aber ich krieg das einfach nicht...
Ich hab immer 3 Klassen gehabt:
Code:
class Main
{
private:
      Foo* m_foo;
public:
      Main(QString data)
     {
         m_foo=new Foo(data);
         Bar bar1=new Bar(m_foo);
         Bar bar2=new Bar(m_foo);
         Bar bar3=new Bar(m_foo);
     }
}

class Foo
{
private:
     QString m_data1;
     QString m_data2;
public:
     Foo(QString data)
    {
         m_data1=func1(data);
         m_data2=func2();
    }
    QString func1(QString data){ /*Ich returne eine Internetseite per get*/};
    QString func2()                    { /*Ich returne eine Internetseite per get und benutze data1!*/};
}

class Bar : public QThread
{
     /*Klasse greift auf data von Foo zu (natürlich mit mutexen)*/
}

Neu wäre ja:
Code:
class Foo
{
private:
     QString m_data1;
     QString m_data2;
public:
     Foo(QString data)
    {
         func1(data);
         func2();
    }
    QString func1(QString data){ /*Ich erstelle ein QHttp und termiere*/};
    QString func2()                    { /*Ich erstelle ein QHttp und termiere*/};
public slots:
     void readyRead ( const QHttpResponseHeader & resp )
      {
            Ich schaue mir die Daten an und setze ja nachdem was es nun ist data1 oder data2
      }
}

Aber werden dann nicht meine Bar-Threads erstellt bevor data1 und data2 gesetzt sind?
Das ist nicht gut... Ich steig einfach nicht so recht dahinter. :(
Ich bin der irgendwie der Meinung dass Internetabfragen nichts mit Events zu tun haben.
 
Zuletzt bearbeitet:
Zurück
Oben