QT - Externes Programm öffnen und warten bis es sich beendet

Alles rund um die Programmierung mit Qt
Antworten
T1c4L
Beiträge: 41
Registriert: 25. April 2008 17:10

QT - Externes Programm öffnen und warten bis es sich beendet

Beitrag von T1c4L »

Hi alle,

bin in google und in der doc leider erfolgslos gewesen daher probier ich mein glueck mal hier! Ist fuer mich ein wenig schwer zu erklaeren, ich probiers mal!

Ich suche einen Weg, wie ich aus meiner QT anwendung heraus ein externes Programm starten lassen kann, die QT anwendung soll solange das externe geöffnet ist "warten" bis das Programm wieder geschlossen wurde.

Beispiel mit pseudo code:

Code: Alles auswählen

QWunschClass* b = openFile("test.doc");
while (!b->exit())
{
 // mach nix
}
// progamm beendet, weiter gehts..
Ich arbeite mit c++ STL und QT 4.3.4.



Vielen dank im voraus!
cheers!
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Willst du ein Programm starten, oder eine Datei mit dem dafür zugehörigen Standardprogramm öffnen? Das sind 2 Paar Schuhe.

Für ersteres schaust du dir QProcess an, für letzteres QDesktopServices.
T1c4L
Beiträge: 41
Registriert: 25. April 2008 17:10

Beitrag von T1c4L »

QDesktopServices habe ich schon ausprobiert, diese lässt meine Datei von OS starten, allerdings weiss ich dann nicht mehr wann der user im .doc beispiel, das wordprogram geschlossen hat.


QProcess schau ich mir mal an!
T1c4L
Beiträge: 41
Registriert: 25. April 2008 17:10

Beitrag von T1c4L »

Ich hab das mal mit dem QProcess gemacht aber wie warte ich nun bis der Process beendet wird?

Code: Alles auswählen

QProcess app;
app.lauch( app, args );

while (app.waitForFinished(-1))
{
	// wait
}
Ist das der richtige weg?
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

Die Doku hilft wie fast immer weiter (sie haben sogar noch ein Beispiel publiziert!).
Bei deiner Variante musst du sowohl waitForStarted als auch waitForFinished implementieren. Ich würde hingegen mit execute arbeiten.
Alternativ (wenn du den Mainthread nicht blockieren willst) kannst du auch das Signal finished abfangen.
T1c4L
Beiträge: 41
Registriert: 25. April 2008 17:10

Beitrag von T1c4L »

Thx fuer den Tipp

Aber ich mach immernoch etwas falsch.
Ich möchte das über das Signal machen aber meine SLOT Methode wird nicht angesprungen, ist das so richtig?

Code: Alles auswählen


QProcess* app = new QProcess();
// app params setzen
...

// slot connect
connect(app,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(AppFinished()));
T1c4L
Beiträge: 41
Registriert: 25. April 2008 17:10

Beitrag von T1c4L »

Keiner ne idee oder einen Tipp oder einen gute Code schnipsel?? ich komme da nicht weiter..
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Beitrag von M@g!ndo$ch »

Schau doch mal was bei dem Aufruf von "connect" zurückkommt.
Wenn da "false" zurückkommt, ist das Signal nicht mit dem Slot verbunden und er kann deshalb nicht aufgerufen werden.
T1c4L
Beiträge: 41
Registriert: 25. April 2008 17:10

Beitrag von T1c4L »

So sieht der code aus,
connect ergibt ein true, aber wenn ich die Application Freemind schliesse wird der Slot nicht angesprochen.

Code: Alles auswählen

QStringList args;
args.push_back(filename);
m_MindMapApp = new QProcess();
connect(m_MindMapApp,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(testv()));       
m_MindMapApp->start("c:\\Programme\\FreeMind\\Freemind.exe", args); 
T1c4L
Beiträge: 41
Registriert: 25. April 2008 17:10

Beitrag von T1c4L »

Hi alle,

ich glaub ich hab das problem gefunden.

Also der code funzt wenn ich winamp vlc oder notepad ausführe. finished() wird getriggered nachdem ich die anwendung schliesse.

Aber bei dem Freemind tool geht es nicht! Unterschied zu den anderen ist eigentlich nur das Freemind die java virtual machine benutzt.

wenn ich freemind ausführe mit Qprocess, scheint finished() direkt beim Start der application getriggered zu werden, beim beenden jedoch nicht.

Hat jemand eine idee ?

danke im voraus!!
Antworten