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();
}