Bonjour,
dans mon programme, je dois exécuter des applications externes; pour cela j'utilise donc QProcess.
Ces applications donnent des informations en console sur leur déroulement, qui peut prendre plusieurs minutes. Je voudrais afficher sur mon IHM MainWindow (dans un PlainTextEdit) cette sortie au fur et à mesure du déroulement.
Pour cela j'ai écrit le code suivant:
J'ai écrit ce code dans un objet Worker dérivant de QObject (dans une méthode "executer"). Dans ma classe MainWindow, je crée alors un QThread puis utilise la méthode moveToThread pour executer le code de mon objet Worker dans un Thread séparé du Thread principal.
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 QProcess* progExterne = new QProcess(); progExterne->setWorkingDirectory(projectPath); progExterne->start("./progExterne.sh"); bool processStarted = progExterne->waitForStarted(); if(!processStarted) { emit error("Impossible d'executer proExterne.sh."); return; } else { // Suivi du deroulement de progExterne progExterne->waitForReadyRead(); while(progExterne->state() == QProcess::Running) { sleep(0.01); emit textOut(progExterne->readAllStandardOutput()); } }
En effet le contenu de ma méthode executer ne se résume pas au code ci-dessus mais contient d'autres étapes, c'est pourquoi je n'utilise pas directement les QProcess dans la classe MainWindow.
Mon signal textOut est connecté à un slot de MainWindow, dans lequel j'ajoute le texte reçu en argument dans un QPlainTextEdit.
ça fonctionne, mais:
- je ne suis pas certaine de m'y prendre de la bonne manière, cette façon de coder est-elle correcte?
- l'affichage se passe bien au début mais il est du type:
"Execution de ProgExterne
Démarrage...
Ok
Execution... 0%"
Ensuite seul le "0%" bouge en fonction de l'avancement de l'application, sans créer de nouvelle ligne dans la console. Donc l'affichage s'arrête là dans ma MainWindow, le pourcentage ne se met pas à jour... Comment faire?
Merci d'avance!
Partager