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

Code: Alles auswählen

    MainRoster main_widget;
    main_widget.show();
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.