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

Qt Discussion :

[QProgressDialog] Connaitre la progression d'un programme externe


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 16
    Points
    16
    Par défaut [QProgressDialog] Connaitre la progression d'un programme externe
    Bonjour,
    Je réalise un programme basé sur Inno Setup qui automatise la création d'un installateur pour un programme.
    Pour ce faire, l'utilisateur doit renseigner (entre autre) le répertoire du programme à copié lors de l'installation.

    Ensuite, mon programme génère le fichier au format *.iss et le compile via un QProcess.
    Seulement, selon le nombre d'éléments que l'utilisateur souhaite intégrer à son installateur et les différentes options choisies (ajout d'une clé de registre, installation d'autre executable,etc...), le temps de travail peut être très long et laborieuse pour l'utilisateur. La fenêtre se fige (j'implémenterais des threads plus tard) et on ne sait pas trop ce qu'il se passe, où en est le processus, si ca tourne toujours...

    Donc je souhaitais mettre en place une QProcessDialog ou même une simple QProgressBar permettant d'estimer le temps restant.
    J'ai fait un petit programme (je le pose là si ça peut aider ou intéresser) de test mettant en place une copie de répertoire, une fois en utilisant la taille total du répertoire et une autre fois en utilisant le nombre de fichier qui avaient été copiés.
    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
    30
    31
    32
    33
    34
    35
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QFile>
    #include <QDebug>
    #include <QFileDialog>
    #include <QFileInfo>
    #include <QDir>
    #include <QDirIterator>
    #include <QProgressDialog>
     
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
     
    private slots:
        void on_pushButtonRep_clicked();
     
    private:
        Ui::MainWindow *ui;
        QStringList filesPath;
        qint64 recupDirSz(QString dirPath);
        QString convertUnite(qint64 dirSz);
        void copieFiles(qint64 dirSz);
    };
    #endif // MAINWINDOW_H
    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
    96
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
     
    void MainWindow::on_pushButtonRep_clicked()
    {
        QFileDialog dialRep;
        QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
     
        ui->plainTextEdit->appendPlainText("\t---- Début de la copie du répertoire ----\n");
     
        ui->plainTextEdit->appendPlainText("Liste des fichier:");
        qint64 dirSz = recupDirSz(dir);
     
        //QString convertedSz = convertUnite(dirSz);
        //ui->plainTextEdit->appendPlainText("\nTaille total du répertoire: "+convertedSz);
        ui->plainTextEdit->appendPlainText("\nNombre de fichier dans le répertoire: "+QString::number(dirSz));
     
        ui->plainTextEdit->appendPlainText("\nCopie des fichiers");
        copieFiles(dirSz);
        QApplication::quit();
    }
     
    qint64 MainWindow::recupDirSz(QString dirPath)
    {
        qint64 tailleTotalContent = 0.0;
     
        QDirIterator itRep(dirPath, QDir::Files | QDir::Hidden, QDirIterator::Subdirectories);
     
     
        // Tant qu'on n'est pas arrivé à la fin de l'arborescence...
        while(itRep.hasNext())
        {
            // ...on va au prochain fichier correspondant à notre filtre
            filesPath << itRep.next();
            qint64 currFileSz = itRep.fileInfo().size();
            tailleTotalContent = tailleTotalContent + currFileSz;
        }
     
        return filesPath.size();
    }
     
    QString MainWindow::convertUnite(qint64 dirSz)
    {
        QString unite = "octets";
        if(dirSz >= 1000.0)
        {
            dirSz = dirSz/1000.0;
            unite = "Ko";
            if(dirSz >= 1000.0)
            {
                dirSz = dirSz/1000.0;
                unite = "Mo";
            }
            if(dirSz >= 1000.0)
            {
                dirSz = dirSz/1000.0;
                unite = "Go";
            }
        }
        QString converted = QString::number(dirSz, 'g', 4)+" "+unite;
        return converted;
    }
     
    void MainWindow::copieFiles(qint64 dirSz)
    {
        QString newRep = "./TestCopie/";
        QDir createRep;
        createRep.mkdir(newRep);
        QProgressDialog progress("Copie des fichiers...", "Annuler la copie", 0, dirSz, this);
        progress.setWindowModality(Qt::WindowModal);
     
        for(int elmnt = 0; elmnt < filesPath.size(); elmnt++)
        {
            QFile currFile(filesPath[elmnt]);
            QFileInfo currInfo(currFile);
            currFile.copy(newRep+currInfo.baseName());
            progress.setValue(elmnt);
            if(progress.wasCanceled())
            {
                break;
            }
        }
    }
    Cependant, ce cas reste plutôt éloigné car je reste dans mon application et est accès à toutes les informations.
    Je pensais, dans mon programme Inno Setup, utiliser la taille du répertoire choisit par l'utilisateur et estimer un temps de calcul, mais d'un PC à un autre cela peut varier beaucoup.

    Donc, (enfin) je pose ma question: est-ce que quelqu'un connaitrais un moyen de faire ce que je souhaite, c.à.d garder un œil sur la progression d'inno Setup dans la compilation ou au moins pouvoir estimer un temps de travail pour l'afficher à l'utilisateur ?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 919
    Points : 220 492
    Points
    220 492
    Billets dans le blog
    127
    Par défaut
    Bonjour,

    Pour avoir une telle information, il faut que le programme externe vous donne l'information. Soit, c'est le programme externe qui gère la barre de chargement (l'intégration sera moyenne), soit il envoi les informations et vous les traiter. Toutefois, je doute qu'il fasse cela.
    L'autre solution est donc d'utiliser un QProgressBar avec ce cas particulier (voir la doc) :
    If minimum and maximum both are set to 0, the bar shows a busy indicator instead of a percentage of steps. This is useful, for example, when using QNetworkAccessManager to download items when they are unable to determine the size of the item being downloaded.
    Et vous aurez une indication d'activité, sans pour autant gérer la progression.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    C'est tous ce que je voulais, plus qu'à le mettre dans un thread pour éviter que cela ne fige et ce sera suffisant.

    Merci beaucoup pour cette réponse clair et rapide

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

Discussions similaires

  1. Comment exécuter un programme externe ?
    Par spikto dans le forum Langage
    Réponses: 12
    Dernier message: 27/06/2005, 17h18
  2. faire un test sur un programme externe
    Par marieheraud dans le forum Windows
    Réponses: 3
    Dernier message: 02/09/2004, 19h32
  3. [Kylix] pb d'appel de programme externe
    Par wizwiz dans le forum EDI
    Réponses: 2
    Dernier message: 27/08/2004, 10h29
  4. [Debutant(e)]Execution d'un programme externe
    Par saidi_chahrat dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 26/08/2004, 12h35
  5. appel programme externe depuis pl/sql
    Par txouki dans le forum PL/SQL
    Réponses: 6
    Dernier message: 11/05/2004, 19h35

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