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

Qt Discussion :

Exemple QProcess FAQ: aide compréhension


Sujet :

Qt

  1. #1
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut Exemple QProcess FAQ: aide compréhension
    J'ai testé l'exemple suivant: http://www.developpez.net/forums/sho...5&postcount=36

    C'est pour essayer de comprendre le fonctionnement de QProcess. Ca m'a bien aidé. Par contre je ne comprends pas pourquoi quand je lance le programme cmd .exe (de XP) avec l'exemple (ProcessManipulator) les 1ères lignes qui s'affichent sont:

    Microsoft Windows XP [version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.
    et pas:

    Microsoft Windows XP [version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.

    [chemin_vers_le_répertoire_courant]>
    Pourtant si j'ai bien compris il se passe:
    - appel du process cmd.exe et démarrage
    - cmd.exe envoie ce que j'ai quoté en 2ème sur la sortie standard
    - le signal readyReadStandardOutput() est émit la fonction newLigne() est appellée
    - la fonction newLigne() lit chaque ligne que j'ai quoté en 2ème.

    Pourquoi alors la dernière ligne n'est pas lue?

    La connexion en jeux est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(&m_Process,SIGNAL(readyReadStandardOutput ()),this,  SLOT(newLigne()));
    m_Process est une instance de QProcess.

    La fonction newLigne():
    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
    void MainWindow::newLigne()
    {
    	//on selectionne le channel de la sortie standard de l'exe
    	m_Process.setReadChannel ( QProcess::StandardOutput );
    	//tant que l'on peut lire une ligne
    	while (m_Process.canReadLine ())
    	{
    		//affiche en noire la sortie de l'exe dans le text brower.
    		// on elève les caractère \r et \n
    		m_pTexB->append  
    					(
    						QString("    ")
    						+
    						QString(m_Process.readLine()).remove('\n').remove ('\r')
    					);
    	}	
    }
    Merci pour votre aide

    Les 3 fichiers de l'exemple:

    MainWIndow.h

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     #ifndef MAINWINDOW_H
     #define MAINWINDOW_H
     #include <QtGui>
     class MainWindow : public QWidget
     {
     Q_OBJECT
     
     public:
        MainWindow(QWidget * parent =0);
    	// lance un exe
    	void start(const QString &);
     public slots:
    	//recupère les donné de la sortie standard de l'exe
    	void newLigne();
    	//recupère les donné de la sortie erreur de l'exe
        void newLigneErr();
    	//Ecrit la commande dans l'entrée standars de l'exe
    	void sendCommand();
     
     private :
    	//Qprocess qui interface l'exe
    	QProcess		m_Process;
    	//ligne de commande
    	QLineEdit 		*m_pLineEdit;
    	//visualisation  des commande et des sortie de l'exe
    	QTextBrowser 	*m_pTexB;
    };
     
     #endif
    MainWindow.cpp

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #include "MainWindow.h"
    #include <iostream>
     
    MainWindow::MainWindow(QWidget * parent)
    :QWidget(parent)
    {
    	//Creation et positionnement  la ligneedit  et du text brower
    	QLayout * l = new QVBoxLayout;
    	{
    		m_pLineEdit = new QLineEdit(this);
    		m_pTexB = new QTextBrowser(this);
    		l->addWidget(m_pLineEdit);
    		l->addWidget(m_pTexB);
    	}
    	this->setLayout(l);
     
    	//si des données arrivent de la sortie standard de l'exe  on va les lire
    	connect(&m_Process,SIGNAL(readyReadStandardOutput ()),this,  SLOT(newLigne()));
    	//si des données arrivent de la sortie d'erreur de l'exe  on va les lire
    	connect(&m_Process,SIGNAL(readyReadStandardError ()),this,  SLOT(newLigneErr()));
    	//sil'utilisateur appuie sur "entrée" on ecrit la commande sur l'entré standard de l'exe
    	connect(m_pLineEdit,SIGNAL(returnPressed ()),this,  SLOT(sendCommand()));
    }
     
    void MainWindow::start(const QString &s_exe)
    {
    	//met le nom de l'exe en titre de la fenetre
    	QFileInfo finfo(s_exe);
    	this->setWindowTitle (finfo.fileName ());
     
    	//lance l'exe dans un process
    	m_Process.start(s_exe);
    	//Attend que l'exe soit bien lancé
    	if(!m_Process.waitForStarted () )
    		std::cout<<"not started"<<std::endl;
    }
     
    void MainWindow::sendCommand()
    {
    	QString command = m_pLineEdit->text();
    	//ecrit la commande sur l'entrée standard de l'exe
    	m_Process.write(command.toAscii () );
    	//ajoute un retour a la ligne
    	m_Process.putChar ( '\n' );
     
    	//affiche en bleu la commande dans le text brower
    	m_pTexB->append
    					(
    						QString("<font color=\"#0000ff\">=>\t")
    						+
    						command
    						+
    						QString("</font>")
    					);
    	m_pLineEdit->clear();
    }
     
    void MainWindow::newLigne()
    {
    	//on selectionne le channel de la sortie standard de l'exe
    	m_Process.setReadChannel ( QProcess::StandardOutput );
    	//tant que l'on peut lire une ligne
    	while (m_Process.canReadLine ())
    	{
    		//affiche en noire la sortie de l'exe dans le text brower.
    		// on elève les caractère \r et \n
    		m_pTexB->append  
    					(
    						QString("    ")
    						+
    						QString(m_Process.readLine()).remove('\n').remove ('\r')
    					);
    	}	
    }
     
    void MainWindow::newLigneErr()
    {
    	//on selectionne le channel de la sortie d'erreurde l'exe
    	m_Process.setReadChannel ( QProcess::StandardError);
    	//tant que l'on peut lire une ligne
    	while (m_Process.canReadLine ())
    	{
    	//affiche enrouge la sortie d'erreur de l'exe dans le text brower.
    	// on elève les caractère \r et \n
    	m_pTexB->append  
    					(
    						QString("<font color=\"#ff0000\">    ")
    						+
    						QString(m_Process.readLine()).remove ('\n').remove ('\r')
    						+
    						QString("</font>")
     
    					);
    	}
    }
    main.cpp

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <MainWindow.h>
    #include <QtCore>
     
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
     
    	//on recupère l'exe à lancer
    	QString s_exe;
    	if (argc ==1)
    	{
    		//Si le nom de l'exe n'est pas donné en paramètre,
    		//on ouvre une boite de dialogue pour chercher un exe
    		s_exe= QFileDialog::getOpenFileName ( 0, "Donner l'exe", 0,  QObject::tr("Executable (*.exe)"));
    	}
    	else
    	{
    		//recupère le premier argument passé en parametre
    		s_exe = argv[1];
    	}
        MainWindow w;
    	//lancement de l'exe
    		w.start(s_exe);
    	//Redimensionne la fenetre
    	w.resize(800,600);	
    	//Affiche la fenetre
        w.show();
     
    	//lancement de l'eventloop principale
        return app.exec();
    }

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    J'y avait pô réfléchit.
    C'est peut etre à cause des readline ou canReadLine ()
    Qand
    [chemin_vers_le_répertoire_courant]>
    est ecrit sur la console, il n'y as pas de retour a la ligne.
    a tester

  3. #3
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Ah oui c'est possible. En faisant un readAll() ou readAllStandardOutput() tout apparaît. Mais le problème cest que même les commandes tapées au clavier réapparaissent dans le QTextBrowser.

    Par exemple si je lance le programme avec cmd et que je tape une 1ère commande "help", le mot help apparaît avant le contenu de l'aide:

    Microsoft Windows XP [version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.

    [chemin_vers_le_répertoire_courant]>
    help
    Pour plus d'informations sur une commande spécifique, entrez le nom de la commande HELP.
    ASSOC Affiche ou modifie les applications associées aux extensions de...
    Ca veut dire que la commande envoyé au processus cmd est elle même renvoyé sur la stdout de ce dernier?

  4. #4
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Oui; il te suffit de supprimer du flux et basta
    Edit: (re?)pense au fameux echo on et echo off des bons (heu... non pas bon pardon) scripts batchs.

  5. #5
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Ah oui c'est vrai (une lumière apparaît dans mon esprit ) c'est exactement la même chose

    Mais si j'envoie un @ avant d'envoyer ma commande ça ne marche pas. Je vais voir comment supprimer le flux.

    D'ailleurs dans la console de notepad++ il se passe la même chose. C'est peut être pas si simple à enlever. M'enfin je vais chercher.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Oui; il te suffit de supprimer du flux et basta
    Edit: (re?)pense au fameux echo on et echo off des bons (heu... non pas bon pardon) scripts batchs.
    batchs?????
    quel batch????????
    je ne comprend pas??

  7. #7
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Bah, les fichiers .bat, faut pas chercher plus loin

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Bah, les fichiers .bat, faut pas chercher plus loin
    cmd est un *.bat ????
    ou alors j'ai zappé quelque chose.

  9. #9
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Non non non
    Par contre les commandes que tu places dans un batch sont réaffichées à l'écran à moins de mettre un echo off avant les commandes a ne pas afficher. C'était juste une anologie pour illustrer le fait que cmd affiche la commande qu'on lui demande d'exécuter puisqu'il renvoit sur la sortie standard l'entrée utilisateur pour que l'utilisateur sache ce qu'il a tapé.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Non non non
    Par contre les commandes que tu places dans un batch sont réaffichées à l'écran à moins de mettre un echo off avant les commandes a ne pas afficher. C'était juste une anologie pour illustrer le fait que cmd affiche la commande qu'on lui demande d'exécuter puisqu'il renvoit sur la sortie standard l'entrée utilisateur pour que l'utilisateur sache ce qu'il a tapé.
    ha ok.
    Je viens de comprendre

Discussions similaires

  1. Besoin d'aide (compréhension)
    Par Zifnab dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/07/2007, 19h16
  2. aide compréhension instruction javascript
    Par calitom dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/12/2006, 12h20
  3. Aide compréhension erreur
    Par calitom dans le forum Langage
    Réponses: 3
    Dernier message: 15/12/2006, 21h05
  4. exemple de l'aide m$
    Par pat1545 dans le forum Access
    Réponses: 4
    Dernier message: 16/08/2006, 22h50
  5. exemple du FAQ inexacte
    Par kevredon dans le forum Général Java
    Réponses: 10
    Dernier message: 18/05/2006, 13h52

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