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:
Citation:
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
et pas:
Citation:
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:
connect(&m_Process,SIGNAL(readyReadStandardOutput ()),this, SLOT(newLigne()));
m_Process est une instance de QProcess.
La fonction newLigne():
Code:
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:
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:
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:
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();
} |