IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Sortie de QProcess

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 2
    Par défaut Sortie de QProcess
    Bonjour,

    j'ai un petit problème sur une application pour rediriger la sortie d'un QProcess (c'est-à-dire la sortie qu'on obtient quand on lance le programme externe via une commande DOS vers un widget).
    Lla sortie est dirigé automatiquement vers le panneau de sortie de QtCreator (fenêtre/panneau de sortie/sortie de l'application)
    je pense que c'est un problème de configuration, j'ai essayé de modifier le fichier .pro avec ceci:
    DEFINES+=QT_NO_DEBUG_OUTPUT
    mais ça n'a pas résolu le problème.
    Quelqu'un a une idée?
    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void IHM::on_pushButton_clicked()
    {
              QProcess *exec = new QProcess();
              for (int i = 0; i<3; i++)
              {
                        QStringList arg;
                        arg << "arg1"
                        exec->start("C:/prog.exe", arg);
                        exec->waitForFinished(-1);
                        int nb = exec->bytesAvailable(); //nb=0
                        QByteArray temp = exec->readAll(); //temp = ""
                        ui->textBrowser->insertPlainText(temp.data());
              }
    }

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Bonjour Jefco,

    Si j'ai bien compris, le problème réside dans le fait que tu reçois la sortie de ton QProcess dans la fenêtre output de QtCreator, et que du coup tu obtiens un chaîne vide en appelant readAll() ?

    Premièrement, je ne suis pas sûre que readAll() soit la meilleure fonction pour faire ça, en tout cas elle n'est pas mentionné dans la doc de QProcess. Donc essaye peut être avec une autre fonction comme read() ou readAllStandardOutput.

    Je ne sais pas comment empêcher la sortie dans l'output de QtCreator, par contre, as-tu essayé d'utiliser le signal readyRead() (hérité de QIODevice) et de lire ta sortie depuis un slot connecté a ce signal, en utilisant read(), readLine(), readAll() (à vérifier), ou alors readAllStandardOutput. Peut être retrouveras-tu la même chose que sur la fenêtre de sortie de QtCreator.

    Voici ce que cela pourrait donner en modifiant un peu ton code. Attention c'est juste un exemple, pas très propre.

    Dans le header de ta class IHM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class IHM
    {
    ...
    public slots:
    	void readOutput();
    ...
    };
    Ta fonction click bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void IHM::on_pushButton_clicked()
    {
              QProcess *exec = new QProcess();
    	  //Connexion à ajouter(pas très propre mais c'est pour l'exemple)
    	  connect(exec, SIGNAL(readyRead()), this, SLOT(readOutput());
              for (int i = 0; i<3; i++)
              {
                        QStringList arg;
                        arg << "arg1"
                        exec->start("C:/prog.exe", arg);
                        exec->waitForFinished(-1);
    		    //Suppression des lignes suivantes, on fait 
    	     	    //le traitement dans readOutput
                        //int nb = exec->bytesAvailable(); //nb=0
                        //QByteArray temp = exec->readAll(); //temp = ""
                        //ui->textBrowser->insertPlainText(temp.data());
              }
    }
    Le slot qui s'occupe de lire la sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void IHM::readOutput()
    {
        //Lecture de la sortie de QProcess
        int nb = exec->bytesAvailable();
        QByteArray temp = exec->readAll(); //ou readAllStandardOutput selon tes besoin
        ui->textBrowser->insertPlainText(temp.data());
    }
    C'est en tout cas la solution proposé par la doc Qt de QProcess, voir le chapitre "Communicating via Channels".

    En définissant QT_NO_DEBUG_OUTPUT tu va supprimer les messages provenent des fonction qDebug() et autres. Mais cela ne concerne pas les sortie standard stdout et stderr.

    En espérant que cela puisse t'aider.

Discussions similaires

  1. Sortie standard d'un QProcess
    Par ymoreau dans le forum Qt
    Réponses: 1
    Dernier message: 22/09/2010, 13h53
  2. recuperer sortie console d'un QProcess ?
    Par divide dans le forum Qt
    Réponses: 2
    Dernier message: 11/08/2010, 13h52
  3. Réponses: 1
    Dernier message: 14/05/2009, 15h53
  4. Rediriger le plux de sortie
    Par Groove dans le forum C
    Réponses: 5
    Dernier message: 17/04/2003, 17h16
  5. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo