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 :

Utiliser fopen avec un QTextEdit

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut Utiliser fopen avec un QTextEdit
    Bonjour,

    Je debute en Qt et C++.

    J'utilise fopen pour recuperer la sortie d'une commande donnee et l'afficher au fur-et-a-mesure dans un QTextEdit.

    Mes commandes ont le format suivant: commande [options] [fichiers]

    Voici mon probleme: par exemple quand j'execute la chaine "commande -version", tout se passe bien, mais quand j'execute "commande -help", soudainement la sortie ne s'affiche plus dans mon QTextEdit mais dans le terminal (il s'agit ici de la meme commande que le premier exemple). Et il se produit la meme chose quand je lance la commande sans options mais seulement avec les fichiers attendus en parametres.

    Toute aide est la bienvenue, alors n'hesitez pas !

    Merci !!

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 753
    Par défaut
    et bienvenue sur le forum !

    Pourquoi utiliser fopen ? Qt met à ta disposition des pléthores d'outils plus portables ! Notamment QProcess.

    Si tu as besoin d'aide, ce topic devrait être une mine d'informations : http://www.developpez.net/forums/d95...gwin-putty-qt/
    Voir aussi évidemment la doc : http://qt.developpez.com/doc/4.6/QProcess

    Edit : voir aussi la FAQ : http://qt.developpez.com/faq/index.p...ation_Qprocess et http://qt.developpez.com/faq/index.p...ir_application
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut utiliser un QProcess avec un QTextEdit
    MERCI !!!!!!!

    Je vais regarder la doc de cette classe.

    Voici le resultat de mon travail:

    Je rencontre des difficultes a utiliser un QProcess . D'abord je suis contraint de travailler en qt3 pour mon projet donc je vais expliquer pas a pas ma demarche pour que vous compreniez bien. Le principe est d'utiliser un QProcess pour recuperer la sortie d'une commande, afin de l'afficher dans un QTextEdit:

    1_Je cree une fenetre principale de type QMainWindow dans laquelle j'insere comme widget principal un QTextEdit.
    2_Je cree un QProcess dans le but d'executer la commande suivante: find /home/mch/grous -name *.cpp -print
    3_ pour passer la chaine de caracteres a executer, qt3 et qt4 different:
    * En qt4 la fonction start() est surchargee, de sorte que l'on peut soit lui donner un QString "programme" suivi d'un QStringList "arguments", soit lui donner une un unique QString regroupant les 2 informations ( programmes et arguments).
    *En qt3, ces informations ne peuvent pas
    etre passer en parametre de start(), il faut les specifier soit dans le constructeur (ce qui n'est pas possible en qt4), soit en appelant addArgument(QString), soit setArguments(QStringList) [ ces 2 methodes n'existent pas en qt4].
    4_Je lis les donnes ecrites sur la sortie standart par le processus avec readStdout() qui renvoit un QByteArray (vide si aucune donnee ecrite) [l'equivalent qt4 serait readAll() ou read(qint64)]
    5_j'appel la methode statique QString::fromLocal8Bit( char * ) avec mon QByteArray en parametre pour obtenir un QString Unicode.
    6_j'insere ce QString dans mon textEdit.
    Voici donc le code que j'ai d'abord essaye:

    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
     
    #include <qapplication.h>
    #include <qcstring.h> // pour utiliser QByteArray 
    #include <qprocess.h>
    #include <qmainwindow.h>
    #include <qtextedit.h>
     
    int main( int argc, char ** argv ) {
     
    	QApplication app( argc, argv );
     
    	QMainWindow * fen = new QMainWindow;
    	fen -> setGeometry( 400, 400, 1000, 1000 );
    	app.setMainWidget( fen );
    	QTextEdit * textEdit = new QTextEdit( fen );
    	fen -> setCentralWidget( textEdit );
     
    	QProcess * process = new QProcess; 
     
    	process -> addArgument( "find" );
    	process -> addArgument( "/home/mch/grous" );
    	process -> addArgument( "-name" );
    	process -> addArgument( "*.cpp" );
    	process -> addArgument( "-print" );
    	process -> start();
     
    	QByteArray data = process->readStdout();
    	QString str = QString::fromLocal8Bit( data );
    	textEdit -> append(str);
     
    	fen -> show();
     
    	return app.exec();
     
    }
    Et la rien ne s'affiche dans mon QTextEdit ! J'ai donc voulu savoir ce que contenait le QString str: l'instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout << "data\n" << str << std::endl;
    m'affiche dans le terminal "data" seulement ce qui suppose que str est vide. Pour le confirmer, j'ai ajoute l'instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( str.isNull() ) {std::cout << "str est nulle" << std::endl;}
    et la s'affiche le message "str est nulle". Je teste alors si le QByteArray data est vide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( data.isNull() ) {std::cout << "data est nulle" << std::endl;}
    et c'est le cas. Je remonte un cran au-dessus: la commande est-elle lancee ? J'ajoute donc juste apres la ligne process->start(); l'instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i = 0;
    while ( process -> isRunning() ) { i++; }
    std::cout << i << std::endl;
    (ps: isRunning() equivaut en Qt4 a tester si la valeur de retour de state() est QProcess::Running)
    Et la i vaut 243343 donc le processus tourne bien !
    Et de facon surprenante, en ajoutant cette boucle, j'obtiens l'affichage attendu dans mon QTextEdit ! Et de plus tous mes tests deviennent positives ( data non nul, str non nul ...). J'en deduit qu'il faut appeler isRunning() pour "debloquer la situation", je remplace donc ma boucle while par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    process->isRunning();
    et ca ne marche plus meme si je l'appel plusieurs fois.

    tout ce qui precede est aussi observe pour la commande ls -lh que j'ai teste.

    Independamment de cela, j'ai une question de comprehension concernant la methode addArgument(QString): est-il possible d'ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    QString s = find /home/mch/grous -name *.cpp -print;
    process->addArgument(s);
    process->start();
    plutot que faire plusieurs addArguments(QString) ? En Qt4 c'est possible de le faire avec la methode start(QString,OpenMode) ou le QString inclut le nom du programme et ses arguments. Je pense que ce n'est pas possible ici car ca ne fonctionne pas, et de plus il existe une methode setArguments(QStringList) qui permet de specifier le nom du programme (premier element de la liste) et ses arguments ensuite. Confirmez le moi SVP.
    PS: le phenomene decrit au-dessus est identique quand a la place de addArgument(QString), j'emploi setArgument(QStringList):

    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
     
    #include <qapplication.h>
    #include <qcstring.h> // pour utiliser QByteArray 
    #include <qprocess.h>
    #include <qmainwindow.h>
    #include <qtextedit.h>
    #include <qstringlist.h>
     
    int main( int argc, char ** argv ) {
     
    	QApplication app( argc, argv );
     
    	QMainWindow * fen = new QMainWindow;
    	fen -> setGeometry( 400, 400, 1000, 1000 );
    	app.setMainWidget( fen );
    	QTextEdit * textEdit = new QTextEdit( fen );
    	fen -> setCentralWidget( textEdit );
     
    	QProcess * process = new QProcess; 
     
    	QStringList l;
    	l << "find" << "/home/mch/grous" << "-name" << "*.cpp" << "-print";
    	process -> setArguments(l);
    	process -> start();
    	process -> start();
     
    	QByteArray data = process->readStdout();
    	QString str = QString::fromLocal8Bit( data );
    	textEdit -> append(str);
     
    	fen -> show();
     
    	return app.exec();
     
    }
    Conclusion: dans tous les cas la commande est lancee ( avec ou sans l'appel de isRunning() dans un while ), d'ailleurs j'ai aussi teste la commande "touch fichier" et le fichier est bien creer. Par contre, pour recuperer la sortie (quand elle existe, ce qui est pqs le cas pour "touch"), je dois faire suivre l'appel de start(); par while( process->isRunning() ); Pourquoi ?

    Je pourrai vous donnez un autre exemple concernant la commande que je dois executer dans le cas de mon projet, mais je crois que vous en avez assez ? J'aimerai que vous m'aidiez a faire la "mise au point" !

    Toutes les idees sont le bienvenue.

    Merci beaucoup de votre aide !!!

  4. #4
    Invité
    Invité(e)
    Dernière modification par johnlamericain ; 04/08/2010 à 23h29. Motif: changement lien doc DVP

  5. #5
    Invité
    Invité(e)
    Par défaut
    ......

    Tu peux ajouter cette commande ">>texte.txt", pour avoir la sortie de ton programme , dans un fichier texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "find /home/mch/grous/ -name *.cpp -print >> texte.txt"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (...)
    QString program = "find" ;
    QStringList liste ;
    liste.operator<<("/home/mch/grous/")<<("-name") ;
    liste.operator<<("*.cpp")<<("-print")<<(">>")<<("texte.txt") ;
    QProcess process1 ;
    process1.execute(program,liste) ;
    (...)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut
    Merci, mais cela ne semble pas fonctionner (en l'adaptant a qt3) car le fichier texte n'est pas creer, et s'il existe au depart, il reste vide.

    Par contre, et sans que je comprenne pourquoi, en introduisant le code que j'ai presente avant, dans des methodes d'instances, il fonctionne pour la plupart des commandes et cela sans necessiter la boucle:
    while( process.isRunning() ) {;}
    Pour les commandes ou je n'avais pas d'affichage j'ai pu resoudre le probleme comme suit:
    a la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    QByteArray data = process->readStdout();
    QString str = QString::fromLocal8Bit( data );
    textEdit -> append(str);
    j'ai ecrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QByteArray data = process->readStdout();
    textEdit -> append(QString(data));
    Et ca fonctionne bien, et encore mieux avec un insert plutot que append ( pour une sortie de type "...............", j'avais un retour a la ligne pour chaque point avec append).

    En conclusion, je n'explique toujours pas ce qui se passe dans le main, mais j'arrive maintenant a faire ce que je veux.
    Merci pour vos reponses, ainsi qu'a tous ceux qui ont pris le temps de lire ma discussion !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Kylix 3] Je n'arrive pas à utiliser MySQL
    Par usebob dans le forum EDI
    Réponses: 4
    Dernier message: 15/04/2005, 10h18
  2. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  3. PB de vue utilisant UNION avec ENTERPRISE MANAGER
    Par punglas dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/12/2004, 15h18
  4. Réponses: 12
    Dernier message: 02/02/2004, 13h41
  5. Commande fopen avec Mingw32
    Par Blitzz dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 29/10/2003, 11h07

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