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
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 #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
Cependant, ce cas reste plutôt éloigné car je reste dans mon application et est accès à toutes les informations.
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; } } }
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 ?
Partager