Seite 1 von 1
QT - Externes Programm öffnen und warten bis es sich beendet
Verfasst: 8. Juli 2008 14:23
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!
Verfasst: 8. Juli 2008 14:28
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.
Verfasst: 8. Juli 2008 14:37
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!
Verfasst: 8. Juli 2008 15:22
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?
Verfasst: 8. Juli 2008 15:40
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.
Verfasst: 8. Juli 2008 16:07
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()));
Verfasst: 8. Juli 2008 18:05
von T1c4L
Keiner ne idee oder einen Tipp oder einen gute Code schnipsel?? ich komme da nicht weiter..
Verfasst: 9. Juli 2008 00:31
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.
Verfasst: 9. Juli 2008 10:50
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);
Verfasst: 9. Juli 2008 12:37
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!!