2016-04-13 5 views
3

Ich möchte Befehle verwenden:Wie man eine losgelöste Anwendung durch Terminal-Befehl in Qt-Anwendung ausführen?

cd /opencv/opencv-3.0.0-alpha/samples/cpp/ 
./cpp-example-facedetect lena.jpg 

einen Beispielcode von OpenCV auf geklickt() -Methode der Schaltfläche in Qt Anwendung auszuführen. Also ich benutze:

void MainWindow::on_btSample_clicked() 
{ 
     QProcess process1; 
     QProcess process2; 

     process1.setStandardOutputProcess(&process2); 

     process1.start("cd /opencv/opencv-3.0.0-alpha/samples/cpp"); 
     process1.waitForBytesWritten(); 
     process2.start("./cpp-example-facedetect lena.jpg"); 
} 

ich notwendige Bibliothek hinzugefügt, um es zu benutzen. Aber ich habe einen Fehler, wenn ich meine Anwendung starte.

QProcess: Destroyed while process ("./cpp-example-facedetect") is still running. 

Wie kann ich es beheben? Wenn die Art, wie ich es mache, nicht richtig ist, gib mir einen anderen Weg. Vielen Dank im Voraus!

+1

versuche mit process2.waitForFinished(); – Marco

+0

@Marco Ich habe das versucht, aber ich habe nichts, es gibt keinen Fehler und kein Ergebnis im Bildschirm. –

Antwort

3

Ich glaube, Sie haben zwei Probleme hier:

erstens Ihre QProcess process2 wahrscheinlich außerhalb des Gültigkeitsbereichs wird, bevor es fertig ist (das heißt seit seiner außerhalb des Gültigkeitsbereichs zerstört wird). Sie müssen entweder warten, bis es (mit waitForFinished() zu beenden, oder es einen Zeiger oder Membervariable machen (den Umfang ändern) und schließen Sie das finished() Signal bis zu einem gewissen Handhabungsschlitz (was die aufräumen tun können).

Die eine andere Sache hier ist, es sieht so aus, als ob Sie nur das Arbeitsverzeichnis festlegen möchten, also denke ich nicht, den cd-Befehl in Ihre ausführbare Datei zu leiten, ist der Weg zu gehen, es wäre einfacher, etwas zu tun wie:

EDIT

ich habe mein Beispiel bearbeitet, Ihnen zu zeigen, wie die Ausgabe zu erhalten:

Ich habe das in zwei Minuten auf meine Windows Box gepackt und getestet für Sie ... Ich könnte es unter Linux machen, aber das wird mich ein bisschen länger brauchen, weil ich es hochfahren muss: o. .. aber wenn du willst, werde ich.

EDIT 2

Wenn Sie den Prozess vollständig trennen mögen:

QProcess myProc; 

qDebug() << "Starting process\n"; 
// Setup the working directory 
QDir::setCurrent("D:\\software\\qtTest"); 

// Start the process (uses new working dir) 
myProc.startDetached("test.bat"); 

Jetzt bin ich nicht 100% sicher, dass Sie die Ausgabe wieder aus dem Prozess bekommen ... es ist jetzt nichts mit deiner Qt-App zu tun ...

+0

Ich habe das versucht, aber ich habe nichts, es gibt keinen Fehler und kein Ergebnis im Bildschirm. Hast du eine andere Möglichkeit, es laufen zu lassen? Vielen Dank –

+0

Ich habe mein Beispiel bearbeitet ... Ich denke, es funktioniert für Sie, aber Sie sehen nichts, vielleicht weil Sie nicht die Ausgabe abrufen? ... so verwenden Sie waitForFinished() und lesen Sie dann die Ausgabe mit ' readAll() '. WENN das ein langer Prozess ist, dann müssen Sie es wahrscheinlich anders einrichten und auf das readReady() Signal warten und die Ausgabe lesen, wie sie kommt ... wieder mit dem Slot/Signal. Wenn Sie dieses Beispiel benötigen, dauert es länger, es zu schreiben. –

+0

Vielen Dank. Der Beispielcode wird als Widget-Anwendung ausgeführt, es wird ein Bild angezeigt, aber ich weiß nicht, dass das Abrufen in meinem Fall erforderlich ist. Was ich brauche, ist es einfach zu starten und es ist egal sein Ergebnis: D. –