Seite 1 von 1
File transfer mir QFtp
Verfasst: 29. November 2007 19:48
von alfonsospringer
ich würde gerne QFtp benutzen um eine Textdatei auf meinen Server (localhost reicht erstmal) hoch, bzw runterzuladen. Leider verstehe ich noch nicht ganz wie das geht. Kann mir villeicht jemand ein kleines Beispiel schreiben? Ich weis:
QFtp *ftp = new QFtp(); um einen ftp client zu erstellen
ftp->connectToHost("localhost"); um mich mit meinem Server zu verbinden
ftp->login("loginname","passwort");
aber wie lade ich nun eine Datei hoch?
int put ( QIODevice * dev, const QString & file, TransferType type = Binary )
nimmt doch keine QFiles, oder?

Verfasst: 29. November 2007 20:02
von upsala
Dann schau dir mal die Doku von QIODevice an, und schau dir an welche Klassen davon abgeleitet sind.
Verfasst: 1. Dezember 2007 19:01
von alfonsospringer
ok, soweit klappts - upload erfogreich, thx. Nun würde ich gerne das Programm gerne sich selbst beenden lassen sobald der Transfer abgeschlossen ist. Ich dachte dies ließe sich mit qApp->quit() bewerkstelligen (QApplication ist eingebunden), aber der FTP Prozess ist weiterhin im Taskmanager. Der Code sieht im Moment so aus:
Mein Programm ist gegliedert in 3 Dateien:
main.cpp:
Code: Alles auswählen
#include <window.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
window win(NULL);
win.setVisible(false);
return app.exec();
};
window.h
Code: Alles auswählen
#include <QApplication>
#include <QWidget>
#include <QFile>
#include <QFtp>
class window : public QWidget
{
Q_OBJECT
public:
window(QWidget* parent);
public slots:
private:
QFile* file;
QFtp* ftp;
};
window.cpp
Code: Alles auswählen
#include "window.h"
window::window(QWidget* parent) : QWidget(parent)
{
file = new QFile("upload.txt");
ftp = new QFtp(this);
ftp->connectToHost("localhost");
ftp->login("Public", "meinpw");
ftp->put(file,"upload.txt");
ftp->close();
qApp->quit();
};
Warum klappt das nicht?
Verfasst: 1. Dezember 2007 20:34
von upsala
Weil zu dem Zeitpunkt, zu dem du quit() aufrufst, noch nicht einmal der Event-Handler läuft, somit kann er auch nicht darüber informiert werden, daß er beendet werden soll.
Verfasst: 1. Dezember 2007 20:56
von alfonsospringer
und wie mach ichs dann richtig?
Verfasst: 1. Dezember 2007 21:12
von upsala
Indem du das richtige Signal von QFtp mit dem quit()-Slot verbindest...
Verfasst: 1. Dezember 2007 21:32
von alfonsospringer
danke schon mal, aber
Code: Alles auswählen
#include "window.h"
window::window(QWidget* parent) : QWidget(parent)
{
file = new QFile("upload.txt");
ftp = new QFtp(this);
connect(ftp,SIGNAL(done()),qApp,SLOT(quit()));
ftp->connectToHost("localhost");
ftp->login("Public", "meinpw");
ftp->put(file,"upload.txt");
ftp->close();
qApp->quit();
};
klappt auch nicht....
Verfasst: 1. Dezember 2007 23:47
von Christian81
Wozu gibts eigentlich Beispiele wenn sich eh keiner die Dinge anschaut?
Bei Dir läuft keine evnetqueue - wie soll qftp da was machen können?
Verfasst: 2. Dezember 2007 10:27
von alfonsospringer
ich weis nicht was eine eventque ist - ich dachte das done Signal wird immer ausgesandt wenn alle operationen von qftp abgeschlossen sind.
Kannst du mir villeicht einen Link auf das passende beispiel schreiben?
Verfasst: 2. Dezember 2007 10:58
von Christian81
Einfach mal versuchen
http://doc.trolltech.com/4.2/qftp.html durchzulesen...
Verfasst: 2. Dezember 2007 11:57
von alfonsospringer
ok, jeder auszuführende Befehl bekommt eine eigene ID zugeteilt, mit dem ich dem von commandFinished() ausgestrahltem Signal den richtigen Befehl zuordnen kann. Aber wie bewerkstellige ich nun, dass
qApp->quit() ausgeführt wird wenn commandFinished() die ID von ftp->close() ausstrahlt?
Ich weiss, dass es nervt wenn Leute fragen bevor sie die Doku ausführlich gelesen haben, aber ich bin ein Anfänger und steige durch die Informationsfülle nicht ganz durch.
Verfasst: 2. Dezember 2007 12:06
von Christian81
Genau so wie Du es oben gemacht hast. Und schau Dir endlich das FTP-Example an!!
Verfasst: 2. Dezember 2007 12:09
von alfonsospringer
ach soooo - das aus Examples & Demos? Ich hab jetzt xmal die Doku zu QFtp gelesen ^^
ich scheitere auch hier an der großen Informationsfülle... Gibt es villeicht auch ein einfaches Beispiel, das noch dazu etwas kürzer ist?
Verfasst: 2. Dezember 2007 12:32
von alfonsospringer
ich hab mir jetzt eine Lösung für mein Problem zusammengemogelt indem ich in meiner Klasse noch einen Slot endapp eingeführt habe, dessen Implementation so ausseht:
Code: Alles auswählen
void window::endapp(int proc, bool err)
{
if (proc == tmp)
{
qApp->quit();
};
};
Nun bekomme ich mit:
Code: Alles auswählen
connect(ftp,SIGNAL(commandFinished(int,bool)),this ,SLOT(endapp(int, bool)));
ein funktionierendes Ergebnis