qhttp + angeforderte datei speichern???

Alles rund um die Programmierung mit Qt
Antworten
data
Beiträge: 23
Registriert: 22. November 2004 22:33

qhttp + angeforderte datei speichern???

Beitrag von data »

hi,

ich habe folgende funktion:

Code: Alles auswählen

void waehrung_main::Update()
{
    QMessageBox fehler;
    QHttp http;
    QFile file;
    QDataStream out;
    
    file.setName("/home/daniel/Projekte/c++/mein_qt_test/eurofxref.zip");
    if (!file.open(IO_WriteOnly ))
    {
	fehler.warning(this, tr("HTTP Get"),
			      tr("In Datei %1 kann nicht geschrieben werden: \n%2.")
			      .arg(file.name())
			      .arg(file.errorString()));
	return;
    }
    out.setDevice(&file);
    out.setVersion(5);
    http.setHost("www.ecb.int");
    http.get("/stats/eurofxref/eurofxref.zip", &file);
    http.closeConnection();
}
es legt auch die zu speichernde datei an, jedoch wird diese datei nicht gefüllt.
kann mir bitte jemand auf die sprünge helfen.
wie kann ich den stream in die datei schreiben :?:

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

Beitrag von Christian81 »

deswegen: http://doc.trolltech.com/3.3/qhttp.html#get

Du musst warten, bis das Signal requestFinished() gekommen ist, bevor du closeConnection() aufrufst.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
data
Beiträge: 23
Registriert: 22. November 2004 22:33

Beitrag von data »

hi Christian81,

danke erstmal für deine antwort.

hast du vielleicht noch ein kleines beispiel für mich, irgenwie geht das bei mir nicht :oops:

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

Beitrag von Christian81 »

ungefähr so:

Code: Alles auswählen

MyWidget::init()
{
    file.setName("test.html");
    if (!file.open(IO_WriteOnly ))
    {
        return;
    }
    out.setDevice(&file);
    out.setVersion(5);
    connect( &http, SIGNAL(requestFinished (int,bool)), this, SLOT(requestFinished(int,bool)) );

    http.setHost("www.heise.de");
    http.get("/index.html", &file);
}

MyWidget::requestFinished( int id, bool error )
{
    http.closeConnection();   
}
im Header:

Code: Alles auswählen

class MyWidget : public ...
    Q_OBJECT
...
protected slots:
    requestFinished( int id, bool error );
private:
    QHttp       http;
    QFile       file;
    QDataStream out;
...
}
Der Header muss mit moc geparst werden, was aber, falls du qmake benutzt, imho automatisch geschieht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Christian81 hat geschrieben: Der Header muss mit moc geparst werden, was aber, falls du qmake benutzt, imho automatisch geschieht.
Außer du hast Q_OBJECT vergessen und/oder du hast es nicht als HEADER in die pro Datei geschrieben. So ein Fehler passiert mit alle 100 Header mal, jedesmal wieder bin ich am Fluchen.
data
Beiträge: 23
Registriert: 22. November 2004 22:33

Beitrag von data »

hi,

irgendwie raff ich das nicht :oops:
sitze jetzt seit mehreren stunden dran ... langsam bin ich dran es auf herkömmliche art und weise zu machen, also mittels #include <sys/socket.h>

vorab erstmal entschuldigung wenn ich schon wieder deswegen nerve.
<ich programmiere in c++ mit qt erst seit wenigen tagen.>
ich nutze zur umsetzung des codes den qt-designer (mein os ist linux).
muss ich nun eine separate headerdatei erstellen od. wo muss ich dies im designer deklarieren?
meine qt-version ist im übrigen 3.2.

cu...
daniel

ps:
habe mir bereits das buch "gui-programmierung mit qt3" von a. wesley verlag gekauft, aber irgendwie ist die sache dort mit qhttp nicht richtig erklärt?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

An deiner Stelle würde ich mich erstmal mit moc, uic und signals & slots vertraut machen.

Anbei ein kleines Programm, welches eine Datei von qtforum lädt.

Code: Alles auswählen

entpacken nach qhttp
ins Verzeichnis wechseln
'qmake -project'
'qmake'
'make'
'qhttp'
Das klappt, solange du nicht hinter einem Proxy sitzt.
Mist, kann Datei nicht hochladen da ich hinter einem Proxy bin... *grml*
Schick mir ne Mail :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
data
Beiträge: 23
Registriert: 22. November 2004 22:33

Beitrag von data »

hi Christian81,

erstmal danke für deine erneute hilfe.
bin zur zeit auch hinter einem proxy, hoffe das du überhaupt meine pn bekommst.

cu...
daniel
data
Beiträge: 23
Registriert: 22. November 2004 22:33

Beitrag von data »

hi Christian81,

vielen dank christian das klappt wunderbar :D

ich habe nur noch in der funktion requestFinished das dateihandle (file.close()) wieder geschlossen, dann hat es die datei ordungsgemäß angelegt.
hatte vorher noch probleme insoweit, dass die neu erstellte datei erst bei verlassen der applikation (quit) angelegt wurde.

ne kleine frage hab ich da noch, gibt es noch ne andere (vielleicht bessere variante) die klasse aus einer anderen funktion (unterklasse von main) aufzurufen?
ich mache das wie folgt:

Code: Alles auswählen

void waehrung_main::Update()
{    
    MyWidget *myWidget  = new MyWidget(this);
    return;
}
die funktion update ist mit dem click-event eines buttons der hiesigen klasse verbunden.
also so:

Code: Alles auswählen

main --> widgetklasse mit button update (waehrung_main)
                                                        |
                                                   (clicked)
                                                        |
                                                      Update()  -> MyWidget Klasse
cu...
daniel
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich würde das bischen Funktionalität von MyWidget mit in waherung_main packen und fertig.
Übrigens ist deine waehrung_main::Update() nicht ganz optimial, da du so den Pointer auf MyWidget verlierst. Besser Du definierst eine Variable in der Klasse waehrung_main

Code: Alles auswählen

void waehrung_main::Update()
{   
    /* vorige Instanz löschen */
    if ( m_myWidget )
        delete m_myWidget;
   /* und jetzt neue anlegen */
    m_myWidget  = new MyWidget(this);
}
Aber wie gesagt ist es unnötig, dafür eine extra Klasse zu benutzen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
data
Beiträge: 23
Registriert: 22. November 2004 22:33

Beitrag von data »

hallo,

wie könnte ich am besten ein eigenes signal senden, wenn meine wie oben beschriebene updatefunktion einen erfolg meldet, so dass das parent-widget (genauer ein lineditfield und ein paar variablen) sich aktualisiert?

ich hatte schon hier im forum, sowie bei google recherchiert, konnte jedoch nichts vernünftiges finden.

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

Beitrag von Christian81 »

Was ist so kmpliziert daran, ein 'emit mein_signal' abzuschicken und es im parent aufzufangen? Hast Du schonmal die TT-Tutorials durchgearbeitet?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
data
Beiträge: 23
Registriert: 22. November 2004 22:33

Beitrag von data »

hallo christian,

mein problem daran ist, dass ich das übergeordnete widget (im beispiel oben: parent) nicht ansprechen kann.

cu...
daniel

edit: was meinst du mit "tt" tutorials?

ich glaub ich hab es jetzt.

Code: Alles auswählen

// ... in waehrung_main aufgerufen
connect( update, SIGNAL(finished()), this, SLOT(Update_Ende()) );
//.. widget.h
signals:
	             void finished();
// .. widget.cpp
void MyWidget::Fertig()
{
    // Dateihandle schließen
    file.close();
    // heruntergeladene Datei extrahieren
    Unzip();
    emit finished();
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten