[Gelöst]QProzess::readAll Problem

Alles rund um die Programmierung mit Qt
Antworten
gwydion.dot
Beiträge: 9
Registriert: 18. März 2008 20:43

[Gelöst]QProzess::readAll Problem

Beitrag 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();
    }
Zuletzt geändert von gwydion.dot am 26. März 2008 22:54, insgesamt 2-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: QProzess::readAll Problem

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
moviemax
Beiträge: 56
Registriert: 10. März 2008 09:49
Wohnort: München

Beitrag 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
gwydion.dot
Beiträge: 9
Registriert: 18. März 2008 20:43

Beitrag 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.
moviemax
Beiträge: 56
Registriert: 10. März 2008 09:49
Wohnort: München

Beitrag von moviemax »

und wie sieht jetzt dein code aus? ...
gwydion.dot
Beiträge: 9
Registriert: 18. März 2008 20:43

Beitrag 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.
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag 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.
Antworten