Gelöst: shell-Programm unter QT starten und Ausgabe abfangen
Gelöst: shell-Programm unter QT starten und Ausgabe abfangen
Hallo zusammen,
ich stehe ein wenig auf dem Schlauch: ich möchte unter Qt4 per Button eine shell/consolen-Programm starten, und seine Ausgabe in einem QLabel wiedergeben.
Beispiel: button <Start> ruft df -h in der Shell auf. Die Ausgabe soll dann im Label lbAusgabe ankommen. Ich könnt' mir vorstellen, dass ich "top" mit Redirekt in eine Datei aufrufen muss, deren Inhalt ich dann ins Label lade?
Hab nicht die leiseste Idee, wie ich das shell-Programm starten soll!
Super wäre ein Hinweis auf einen existierenden Quellcode oder die aufzurufenden Funktionen. Internetsuche hat mich bis dato noch nicht schlauer gemacht.
Herzlichen Dank!
Michael
ich stehe ein wenig auf dem Schlauch: ich möchte unter Qt4 per Button eine shell/consolen-Programm starten, und seine Ausgabe in einem QLabel wiedergeben.
Beispiel: button <Start> ruft df -h in der Shell auf. Die Ausgabe soll dann im Label lbAusgabe ankommen. Ich könnt' mir vorstellen, dass ich "top" mit Redirekt in eine Datei aufrufen muss, deren Inhalt ich dann ins Label lade?
Hab nicht die leiseste Idee, wie ich das shell-Programm starten soll!
Super wäre ein Hinweis auf einen existierenden Quellcode oder die aufzurufenden Funktionen. Internetsuche hat mich bis dato noch nicht schlauer gemacht.
Herzlichen Dank!
Michael
Zuletzt geändert von mbergmann am 13. September 2008 11:28, insgesamt 1-mal geändert.
Hallo Elwood, vielen Dank für Deine Antwort!ElwoodJ hat geschrieben:Hallo,
spontan fällt mir da QProcess ein. Das sollte dir helfen.
Gruß
Elwood
Hab mir QProcess mal durchgelesen und daraus das hier gemacht:
Code: Alles auswählen
void DialogImpl::DiskFree()
{
// ToDo:
const QString programm = "/bin/df";
const QStringList argumente = (QStringList() << "-h" << " > " << "free.txt");
QProcess::execute(programm, argumente);
}Aber vieleicht brauche ich ja überhaupt keine Datei anzulegen? Die QT-Doc sagt zu QProcess::execute(): "Any data the new process writes to the console is forwarded to the calling process."
Dann müßte man den doch auch irgendwie abfragen können, um die Ausgaben direkt umzuleiten?
Ich hab das kleine Projekt mal gepackt und angehängt - vielleicht hat ja jemand eine zündende Idee? Bis jetzt komme ich noch nicht wirklich weiter..
Vielen Dank für jeden Tip!
Michael
- Dateianhänge
-
- shellTest.zip
- (30.85 KiB) 213-mal heruntergeladen
DAnke für den Tip Bernd! Das habe ich gerade durchgespielt. /bin/sh -c und auch /bin/bash -c starten demnach wohl unter der Gewalt meines Proggi, übernehmen aber df nicht. Auch in einer Shell gestartet, gibt mein Programm keinerlei Ausgabe her.bst hat geschrieben:Hi,
IO-Redirection wird i.A. von einer Shell gemacht, nicht von einem Kommandozeilenprogramm. Starte also nicht df sondern sh -c o.ä und übergib df als Parameter.
cu, Bernd
Ich hab es dnn halt mal anders probiert -
script erstellt, ausführbar gemacht, und dann so aufgerufen:
Code: Alles auswählen
const QString script = "diskfree.sh";
QProcess::execute(script);Das muss doch schon mal einer vor mir gelöst habe?
Das klingt vielversprechend! Jetzt muss ich noch herausfinden, welche Parameter ich dem Aufruf übergeben muss, und wie ich ein QByteArray an mein QLabel übergeben kann, dann könnte das vielleicht hinhauen. Freu!solarix hat geschrieben:http://doc.trolltech.com/4.4/qprocess.h ... dardOutput ?
Bis jetzt bekomme ich noch das hier:
error: cannot call member function ‘QByteArray QProcess::readAllStandardOutput()’ without object
))-|
Gelöst!
Schlussendlich hab ich's kapiert: Man muss eine Instanz von QProcess schaffen, diese mittels .start() dazu veranlassen, das gewünschte Shellprogramm auszuführen, auf die Bestätigung warten, dass der Prozess abgelaufen ist, und dann mit readAllStandardOutput() das gewünschte QLabel füttern:mbergmann hat geschrieben: Bis jetzt bekomme ich noch das hier:
error: cannot call member function ‘QByteArray QProcess::readAllStandardOutput()’ without object
))-|
Code: Alles auswählen
// Zweck: df aufrufen, Ausgabe in einem QLabel wiedergeben
void DialogImpl::DiskFree()
{
QProcess diskfree;
QByteArray ausgabe;
const QString programm = "df";
const QStringList argumente = (QStringList() << "-h");
lbAusgabe->setText(""); // Ausgabefenster säubern
diskfree.start(programm, argumente); // Programmaufruf
diskfree.waitForFinished(); // auf Rückmeldung warten
ausgabe = "Freier Speicher auf lokalen Medien:\n" + diskfree.readAllStandardOutput(); // Shellausgabe an Variable
lbAusgabe->setText(QString::fromUtf8(ausgabe)); // ...und endlich: Ausgabe im QLabel
diskfree.close(); // Kanal schließen
}Michael