Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt : 5.10.1 - Qt Creator : 4.6.0 - Qt Installer : 3.0.4 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - QBS : 1.11.0

utiliser un programme via QProcess

22 Mar modifié dans Qt / Langage C++
Bonjour à toutes et à tous,

Dans le cadre d'une autre passion, j'ai créé un programme qui travaille en console : abanas.
Un utilisateur m'a demandé une interface graphique, que j'ai créée. J'ai décidé d'utiliser le programme abanas via QProcess, mais comment rediriger la sortie vers un fichier ?
J'ai bien vu la méthode
setStandardOutpuFile(const QString &fileName, OpenMode mode = Truncate)
mais la sortie est-elle redirigeable vers un QTextBrowser ?

Réponses

  • Salut,

    Avant de répondre, 2 questions :
    1) que sort ton programme abanas ?
    2) Pourquoi un QTextBrowser ?

    En gros, tu peux récupérer la sortie du QProcess via readAll(), readAllStandardOutput(), readAllStandardError() au moment où la classe émet des signaux comme readyReadStandardOutput(), readyReadStandardError(), readyRead().
    Après tu peux envoyer le QByteArray dans le widget de ton choix.
  • Salut babaOrom

    abanas sert à créer un Arbre Binaire d'ANAgrammes Successives..

    Un QTextBrowser parce la sortie de base est au format texte et que je ne veux pas qu'on puisse le modifiermodifier... mais ta question allumé d'un coup une petite lueur Mr disant que je n'ai peut-être pas choisi l le bon widget :D
  • Bon...
    Le QTextBrowser a été remplacé par un QTextEdit dont la propriété readonly est à true /:) Merci babaOroms ;)
  • Bon...
    Me voilà de retour sur ce problème... je ne parviens visiblement pas à utiliser correctement QProcess...

    Je connecte le signale readyReadStandardOutput() à un slot nommé showMessage, dans lequel je veux afficher la sortie de readAllStandardOutput dans la statusbar... mais ça ne marche pas :'(

    Je vais continuer de creuser...
  • Salut,

    un peu de code ?
  • mainwindow.h
    #include <QMainWindow>
    #include <QProcess>

    namespace Ui
    {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit MainWindow(QWidget* parent = 0);
    ~MainWindow();

    protected slots:
    void showMessage();

    private:
    Ui::MainWindow* ui__;
    QProcess* abanas__;

    void connection();
    };
    #endif
    mainwindow.cpp
    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui__(new Ui::MainWindow), abanas__(new QProcess(this))
    {
    ui__->setupUi(this);
    connection();
    }
    MainWindow::~MainWindow()
    {
    delete ui__;
    }
    void MainWindow::showMessage()
    {
    ui__->statusBar->showMessage(abanas__->readAllStandardOutput(), 2000);
    }
    void MainWindow::connection()
    {
    connect(abanas__, SIGNAL(readyReadStandardOutput()), this, SLOT(showMessage()));
  • Re,

    alors, qu'est-ce qui ne marche pas exactement ? A priori le code est correcte et devrait afficher quelque chose. Par contre la sortie ne sera pas forcément complète.

    Je pense qu'il faudrait soit faire :

    void MainWindow::showMessage() {
    myOutputBuffer.append(abanas__->readAllStandardOutput();)
    //ici faire un ui__->statusBar->showMessage de la dernière ligne complète trouvé dans myOutputBuffer
    }
    ou

    void MainWindow::showMessage() {
    QByteArray line;
    while(abanas__->canReadLine()) {
    line = abanas__->readLine();
    }
    ui__->statusBar->showMessage(line , 2000);
    }
    J'ai pas testé. Mets des qDebug() pour voir ce que tu récupères.
  • Ce qui ne marche pas : rien ne s'affiche...

    J'ai testé la deuxième version et rien ne s'affiche...
  • Bon... il semble que mon slot ne soit pas appelé... comme si le signal readyReadStandardOutput n'était jamais émis...
  • Le process est-il bien démarré ?
    abana est-il censé écrire dans le flux de sortie ?
  • abanas doit créer deux fichiers (qui sont bien créés, donc le process est bien démarré) et écrit dans le flux de sortie std::cout (car je le vois dans la "console" "Sortie de l'application")...
Connectez-vous ou Inscrivez-vous pour répondre.