Seite 1 von 1
[Gelöst]QProzess::readAll Problem
Verfasst: 18. März 2008 21:48
von gwydion.dot
Guten Tag,
Hänge gerade irgendwie bei QProcess fest.
Ich versuche die Ausgabe von dem Prozess, welchen ich starte, in einen QString zu speichern.
QString bleibt aber immer leer. Weiss jemand was ich vlt. falsch mache? Alles wo ich bei Google fand, verwendete diesen Lösungsansatz.
Code: Alles auswählen
#include <Qt/QtGui>
#include <Qt/qprocess.h>
int main(int argc, char *argv[]) {
//needed vars
QApplication app(argc, argv);
QProcess *mp3gain = new QProcess();
QString mp3gain_version;
//start mp3gain and check for version
mp3gain->execute("mp3gain -v");
while ( mp3gain->waitForFinished() ) {
mp3gain_version = mp3gain->readAll();
}
return app.exec();
}
Gruss und Danke
gwydion
Edit:
Mit sehr viel herumprobieren fand ich es heraus:
Code: Alles auswählen
//start mp3gain and check for version
mp3gain->start("mp3gain -v");
while ( mp3gain->waitForFinished() ) {
mp3gain_version = mp3gain->readAllStandardError();
}
Re: QProzess::readAll Problem
Verfasst: 19. März 2008 07:19
von macman
gwydion.dot hat geschrieben:Mit sehr viel herumprobieren fand ich es heraus:
Es hilft halt nicht nur die Funktionen zu kennen. Man sollte auch die detaillierte Doku dazu lesen, um zu wissen was die Funktionen eigentlich machen.
Bin mal gespannt wie viele die Formatierungstags aus dem Codeschnipsel mit nutzen
Und bitte Einträge auf gelöst setzen, wenn sie gelöst sind.
Verfasst: 19. März 2008 07:45
von Christian81
Gelöst ist es nicht wirklich - ein Hack wurde gefunden, mehr nicht.
Wenn ich die Daten jedes Mal überschreibe, brauche ich mich nicht zu wundern wenn nicht alles (oder nichts) drin steht...
Verfasst: 19. März 2008 12:50
von moviemax
dein code ist etwas unlogisch wie der Christian81
schon bemerkt hat
also ich würde warten bis der prozess zu ende ist, und dann alles lesen
(die frage ist ob alle ausgaben zu diesem zweck gepuffert werden
einfach auf das Signal finisched() lauschen,
und dann alles auslesen.
Du blockierst ja sonst wegen der ausgabe den ganzen hauptthread.
Moviemax
Verfasst: 25. März 2008 18:15
von gwydion.dot
Guten Tag
Die Dokumentation habe ich eigentlich gelesen, aber wohl nicht gut genug.
Zum Blockieren, das stört mich in diesem Falle nicht, da die Anwendung beendet falls die Rückgabe nicht einer Regel entspricht. Bzw. das Programm darf erst weiter laufen sobald die Ausgabe geprüft wurde.
Verfasst: 26. März 2008 09:32
von moviemax
und wie sieht jetzt dein code aus? ...
Verfasst: 26. März 2008 21:54
von gwydion.dot
Guten Tag,
Hab es jetzt so gemacht wie es vorgeschlagen wurde, dabei stiess ich aber auf ein Problem, vlt. kann man mir hier gleich weiter helfen.
Erst mal der Code:
main.ccp
Code: Alles auswählen
#include <Qt/QtGui>
#include "mainroster.h"
#include "quickwidget.h"
#include "process.h"
int main(int argc, char *argv[]){
//needed vars
QApplication app(argc, argv);
//check mp3gain
Process mp3gain;
//all went fine so we create the widget now
MainRoster main_widget;
main_widget.show();
return app.exec();
}
process.cpp
Code: Alles auswählen
#include "process.h"
Process::Process(){
mp3gain = new QProcess;
mp3gain->start("mp3gain -v");
connect( mp3gain, SIGNAL( finished ( int, QProcess::ExitStatus ) ), this, SLOT(readOutput()) );
}
void Process::readOutput(){
//compare string
QString mp3gain_version;
//get process output
mp3gain_version = mp3gain->readAllStandardError();
//compare the output, check the version
int check = QString::compare(mp3gain_version, "mp3gain version 1.4.6");
//chec the result, if 1 all is ok, else the were a problem with mp3gain
if( check == 1 ){
//create the window
}
else{
QString error;
error.setNum(check);
QMessageBox::information(this, "Error", error);
}
}
Jetzt mein Problem, wie kann ich bewerkstelligen, dass im der main.cpp
Nur dann ausgeführt wird falls check == 1 war? Bzw. irgendwo muss ich eine Methode noch haben womit ich vom main aus auf das Objekt lauschen kann?
Stehe irgendwie auf dem Schlauch, danke für Tipps wo ich suchen muss.
Verfasst: 27. März 2008 01:43
von C167
eine - sicher nicht die beste - Loesung waere, ein Signal zu emmitieren, dessen slot dann die Objekte anlegt.
steht in check eine 1 machst du ein "emit checkPassed();" und verbindest einen beliebigen SLOT dahin
Andere Moeglichkeit (wird AFAIK in JAVA so gemacht *duck*) ist, der Klasse die Elternklasse per Konstruktor mitzugeben damit man auf deren Methoden zugreifen kann.