File transfer mir QFtp

Alles rund um die Programmierung mit Qt
Antworten
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

File transfer mir QFtp

Beitrag 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? :)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann schau dir mal die Doku von QIODevice an, und schau dir an welche Klassen davon abgeleitet sind.
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag von alfonsospringer »

und wie mach ichs dann richtig?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Indem du das richtige Signal von QFtp mit dem quit()-Slot verbindest...
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag 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....
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Einfach mal versuchen http://doc.trolltech.com/4.2/qftp.html durchzulesen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Genau so wie Du es oben gemacht hast. Und schau Dir endlich das FTP-Example an!!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag 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?
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag 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

tmp = ftp->close();

Code: Alles auswählen

connect(ftp,SIGNAL(commandFinished(int,bool)),this ,SLOT(endapp(int, bool)));
ein funktionierendes Ergebnis
Antworten