KDevelop
Herunterladen der Datei
Unsere eigentliche Aufgabe besteht im Programmieren des zweiten Buttons. Wir werden auf andere Komponenten zugreifen. Es ist daher notwendig, die entsprechenden Headerdateien hinzuzufügen. Da wir die Felder des Typs QLineEdit
und QtextEdit
verwenden, fügen wir folgende Headerdateien hinzu:
#include <qlineedit.h> #include <qtextedit.h>
Wie schon oben gesagt, verwenden wir auch die Klasse KProcess
wir benötigen also die Headerdatei kprocess.h. Nachdem wir die beschriebenen Tätigkeiten durchgeführt haben, können wir uns mit der Anwendung der Funktion DownloadBTN_Slot
beschäftigen. In Listing 2 befindet sich der gesamte Quellcode dieser Funktion. Zunächst sollten wir zwei Variablen definieren. Die erste Variable (task
) steht für einen externen Prozess, den wir erstellen müssen, um den Befehl wget
auszuführen. Die zweite Variable (reader
) ist ebenfalls von großer Bedeutung. Es handelt sich hier um die von uns definierte Klasse, die benötigt wird, damit wir die Daten von dem Standardausgang abfangen können. In der nächsten Zeile platzieren wir eine Meldung, die darauf hinweist, dass das Aufrufen von wget
gerade beginnt. Nun können wir uns mit der eigentlichen Aufgabe beschäftigen. Wir erstellen das Objekt task
:
task=new KProcess;
Anschließend können wir festlegen, wie das Aufrufen des Befehls wget
aussehen soll. Wir nehmen an, der Befehl wird wie folgt aufgerufen:
wget --progress=dot http://www.adresse.de/verzeichnis/datei.zip
Zu den größten Vorteilen der Klasse KProcess
gehört die Tatsache, dass ein Befehl mit Hilfe des Operators <<
erstellt werden kann. Der erste Teil muss selbstverständlich den Namen des Befehls enthalten. Der Code, mit dessen Hilfe der Befehl erstellt wird, sieht wie folgt aus:
*task << "wget -progress=dot"; *task << AddressText->text();
Die Adresse der Datei wird aus dem Widget AddressText abgelesen. Es lohnt sich noch festzulegen, welcher Typ der Oberfläche beim Aufrufen des Befehls wget
verwendet werden soll. Dies wird mit Hilfe der Methode setUseShell
erfolgen. Der Code, der für diese Aufgabe zuständig ist, sieht wie folgt aus:
task->setUseShell(true, "/bin/sh");
In diesem Moment könnten wir zwar unseren Prozess mit Hilfe der Methode start
starten, jedoch finden alle Meldungen des Programms wget
in der Konsole statt, in der das Programm gestartet wurde. Falls wir uns in einer graphischen Umgebung befinden, werden wir keine Meldungen sehen können. Aus diesem Grund müssen wir alle Daten abfangen, die an stdout
und stderr
geschickt werden. Zu diesem Zweck verwenden wir das Objekt reader
. Damit alles richtig funktionieren kann, sollte in das Feld edt
ein Verweis auf die Komponente QRextEdit
namens MessageBoxText
gesetzt werden:
reader.edt = MessageBoxText;
Als nächste Aufgabe sollten wir das Signal anschließen, das für den Empfang der Daten, die an die Standardausgänge durch die Objekte des Typs KProcess
geleitet werden, verwendet wird. Wir benutzen dabei die Methode connect
der Klasse QApplication
. Der Code aus dem Listing 2 fängt unter Zuhilfenahme des Objekts reader
die Daten an den Standardausgängen ab.
Das Anschließen des Signals sieht im ersten Fall wie folgt aus:
QApplication::connect(task, SIGNAL(receivedStdout(KProcess *, char *, int)), &reader, SLOT(read_stdout(KProcess *, char *, int)));
Der Befehl für den Standardausgang stderr
ist sehr ähnlich.