KDevelop
Bei der Verwendung von QApplication::connect
greifen wir auf die internen Mechanismen zu, daher sind die Parameter wichtig, die wir im Falle dieser Methode angeben. Der erste ist das Objekt, das ein Signal generieren wird unser Objekt task
. Mit Hilfe des zweiten Parameters legen wir die Art des Signals fest. Beachten wir den Namen der Funktion: receivedStdout
. Im Falle des Ausgangs stderr
handelt es sich beim Definieren des Signals um folgende Funktion: receivedStderr
In beiden Fällen nimmt die Funktion, die auf das Signal reagiert, dieselben Parameter an.
Im dritten Argument der Methode connect
weisen wir auf ein Objekt hin, das das Signal empfangen wird reader
.
Im letzten Parameter sollen wir die Methode festlegen, die als Reaktion auf das Signal aus dem Objekt reader
aufgerufen wird. In der Nomenklatur von Qt/KDE wird die Methode, die auf ein Signal antwortet, Slot genannt daher verwenden wir im letzten Parameter das Makro SLOT
.
Nachdem die beiden Signale angeschlossen worden sind, können wir das Programm wget
starten, indem wir die Methode start
aus dem Objekt task
aufrufen. Um die zu stdout
und stderr
geschickten Daten abzufangen, müssen wir in der Methode start
zusätzliche Parameter angeben: KProcess::Block
und KProcess::AllOutput
.
Der erste Wert bedeutet, dass unsere Applikation angehalten wird, solange der Befehl wget
ausgeführt wird. Der zweite Wert bedeutet, dass wir alle Informationen abfangen werden, die an die Standardausgänge geschickt werden. Sollte das Verwalten des Standardeingangs notwendig sein, geben wir folgenden Wert an: KProcess::Stdin
. Möchten wir hingegen alle drei Standardein- und Ausgänge kontrollieren, müssen wir in der Methode start
die Konstante KProcess::All
angeben.
Wie wir in Listing 2 sehen, ist das Aufrufen mit einer Bedingungsanweisung verknüpft. Falls die Methode die true
zurückgibt, ist der externe Prozess erfolgreich abgeschlossen und die Datei heruntergeladen worden. Auf diese Art und Weise haben wir ein Programm erhalten, das eine unkompilierte Schnittstelle für den Befehl wget darstellt. Für die Implementierung ist noch die Klasse Reader übrig geblieben.
DownloadBTN_Slot
, die für das Herunterladen einer Datei zuständig ist. void wgetGuiWidget::DownloadBTN_Slot() { KProcess *task; Reader reader; MessageBoxText->append(">>> process begin <<<"); task=new KProcess; *task << "wget --progress=dot"; *task << AddressText->text(); task->setUseShell(true, "/bin/sh"); reader.edt = MessageBoxText; QApplication::connect(task, SIGNAL(receivedStdout(KProcess *, char *, int)), &reader, SLOT(read_stdout(KProcess *, char *, int ))); QApplication::connect(task, SIGNAL(receivedStderr(KProcess *, char *, int)), &reader, SLOT(read_stderr(KProcess *, char *, int))); if(task->start(KProcess::Block, KProcess::AllOutput)) { MessageBoxText->append(">>> process end <<<"); } else { MessageBoxText->append(">>> process failed <<<"); } }