Seite 1 von 1

Output von QProcess auslesen

Verfasst: 8. Juni 2010 20:15
von Jimmyanderson
Hallo Leute,
ich kämpfe grade damit, den Output den ein QProcess ausgibt auszulesen.
"myProcess->execute("pgrep gst-launch-0.10");"
Bei diesen Befehl werden insgesamt 4 Zahlen ausgeben, die würde ich gerne in einen String speichern.Danke schon mal für die Antworten.

Verfasst: 8. Juni 2010 20:40
von Christian81

Verfasst: 8. Juni 2010 21:32
von Jimmyanderson
Hey
danke für die Antwort,aber irgendwie klappt es immer noch nicht. Kann mir jemand, dass vllt so grob erklären? Ansich würde mir glaub ich das Prinzip schon reichen.

Verfasst: 8. Juni 2010 21:37
von franzf
Jimmyanderson hat geschrieben:Hey
danke für die Antwort,aber irgendwie klappt es immer noch nicht.
Poste doch mal was du schon hast, und erklär was noch nicht geh.
Schau dir auch speziell waitForFinished() und readAll()/readAllStandardOutput() an.
Die Doku bringt unter "Synchronous Process API" ein Beispiel das du mit wenig Aufwand auf deine Anwendung umschneidern kannst.

Verfasst: 8. Juni 2010 23:02
von Jimmyanderson
Ich will einen eigenen Mediacenter programmieren. Da ich Ubuntu nutze,dachte ich mir, dass ich Gstreamer für den Mediencenter benutzten werde. Also ich bin schon soweit bekommen, dass ich Musik abspielen kann,jedoch wenn ich das Programm schließe, läuft Gstreamer weiterhin im Hintergrund. Im Internet habe ich kein Befehl gefunden um Gestreamer zu pausieren bzw zu schließen.Daraufhin dachte ich mir ich beende den Prozess durch einen Befehl.Hoffe,dass ich ne grobe Übersicht gegeben habe^^ Quellcode sieht dann folgender massen aus:

// myThread.cpp
Thread::Thread()
{
player = new QProcess;
}

void Thread::run()
{

player->execute("gst-launch-0.10 playbin uri=file:///home/sebastian/Desktop/test.mp3");

}

void Thread::stop()
{
QProcess killer;
killer.start("pgrep gst-launch-0.10");
qDebug() << killer.readAllStandardOutput();
}

Ich musste für mein Programm einen Thread benutzten und Thread::stop ist sozusagen mein Ansatz gewesen,wie die Lösung für mein Problem aussehen könnte. Jedoch klappte dies nicht.

//music.cpp

Music::Music(QWidget *parent) : QWidget(parent)
{
play = new QPushButton("Play");
layout = new QHBoxLayout;

connect(play,SIGNAL(clicked()),this,SLOT(playMyMusic()));
layout->addWidget(play);
setLayout(layout);
}

void Music::playMyMusic()
{

if(player.isRunning())
player.stop();
else
player.start();
}

und hier ist dann eben zum Test ein Fenster mit einem Playbutton, der eben die Musik abspielen bzw abschalten soll.

Verfasst: 9. Juni 2010 06:33
von Christian81
Und wo ist da auch nur ein Hinweis von der Doku die ich gezeigt habe? Im Absatz 'Communicating via Channels' steht ja nun alles was man zumidnest zum erste Test braucht.

Verfasst: 9. Juni 2010 13:45
von Jimmyanderson
QProcess killer;
killer.start("pgrep gst-launch-0.10");
killer.waitForStarted();
killer.waitForReadyRead();
killer.waitForFinished();


player->execute("kill "+ QString(killer.readAll()));

Sooo mit diesem Code hab ich das Problem gelöst :D
Danke für deine Hilfe :D

Verfasst: 9. Juni 2010 13:53
von franzf
Wobei das dreifache waitForXYZ() doch unnötig ist. Es reicht ein reines "waitForFinished()", oder?
Schau mal in die Doku und versuch zu verstehen, was du da treibst ;)

Verfasst: 9. Juni 2010 14:05
von Jimmyanderson
Hast recht waitForFinished(); reicht aus^^
Okay ich muss mir das nochmal alles genau durchlesen.
Ich merk schon Qt und Delphi sind schon andere Welten xD