Bonjour,

je suis en train de développer une interface graphique en Qt pour permettre l'import de données depuis deux fichiers .csv vers une base de données.

j'ai réaliser déjà toute la partie non iHM, soit :
- une classe qui gère l'interface avec la base de données
- une classe "DataImporter" qui permet d'ouvrir les fichiers csv et de préparer les requêtes pour intégrer ces données dans la base de données.
Ce code fonctionne bien.

Maintenant, je cherche à ajouter une interface graphique pour réaliser cet import.
cette interface graphique se compose d'un widget principal contenant :
- deux widget fils personnalisés (contenant, un label et un QLineEdit pour saisir le chemin vers un fichier) correspondant à une classe "UISelectFileNameH"
- un bouton pour déclencher l'import des fichiers par appel du constructeur de la classe "DataImporter".
l'import dans cette configuration fonctionne bien également.

je voulais ensuite ajouter à mon widget principal une QProgressBar pour visualiser l'état d'avancement.
J'ai essayé différentes configuration pour essayer de transmettre une valeur int pour mettre à jour la valeur de la progressBar mais j'avoue que je n'ai pas trouvé la bonne façon de faire.
j'arrive à transmettre un int depuis la classe widget principal vers le constrcteur de la classe "DataImporter". Mais je n'arrive pas à mettre à jour la valeur de la progressbar.
j'ai essayé de transmettre un int représentant le niveau d'avancement depuis la classe "dataimporter" vers la classe "mainwidget" mais je n'arrive pas à brancher cette variable vers un slot de mon mainwidget qui gèrerait la mise à jour de qprogressbar.
j'ai essayé également de créer un signal et un slot personnalisé mais sans succès. depuis mon constructeur "DataImporter", je n'arrive pas à lier à la classe "Mainwidget".
j'ai également, essayé avec la commande et en utilisant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
QCoreApplication::processEvents();
pour forcer la mise à jour de l'IHM.
Je n'arrive pas à trouver la bonne syntaxe.

comment puis-je faire pour animer ma progressbar dans ce contexte sans passer par du multithreading (si possible) comme je suis débutant en programmation Qt ?

Merci pour votre aide / vos conseils !

Ci-dessous le code complet :
dataimporter.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
#ifndef DATAIMPORTER_H
#define DATAIMPORTER_H
 
#include <QDebug>
#include "dbmanager.h"
 
class DataImporter
{
public:
    DataImporter(QString, QString, QString, QString, DBManager *db_m, int *avancement);
    void Create_Model_Variable_Read_Variable_Command(QString,DBManager *db_m);
    void Create_Model_Variable_Read(QString, DBManager *db_m);
 
signals:
    void ChangeValue(int);
 
private:
    bool Integrate_Model_Variable_InBDD(QStringList, DBManager *db_m);
};
 
#endif // DATAIMPORTER_H
dataimporter.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "dataimporter.h"
#include "dbmanager.h"
#include "mainwidget.h"
#include <QFile>
 
DataImporter::DataImporter(QString SPPName, QString SPPDescription, QString codeIn, QString codeOut, DBManager *db_m, int *avancement)
{
    QFile codeIn = codeIn;
    QFile codeOut = codeOut;
    bool importstatus = true;
    bool result=true;
    *avancement = 0;
 
 
 
    if(!codeIn.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << "\n" << "Erreur dans l'ouverture du fichier Inputs" << "/n";
    }
    *avancement = 2;
    if(!codeOut.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << "\n" << "Erreur dans l'ouverture du fichier Outputs" << "/n";
    }
    *avancement = 4;
    QString RequestToAddSPP="INSERT INTO Model(name, description) VALUES('" + VarName + "','" + VarDescription + "')";
    result=db_m->ExecuteQuery(RequestToAddModel);
    if(result==false)
    {
        qDebug() << "Unable to create a new Model entry in Model Table";
    }
    *avancement = 8;
    QString ID_SPP = db_m->FormatQueryResultInString(db_m->SearchAndStartQuery("MaxModel_List","0"));
 
    QStringList allLinesLecture;
    QTextStream inLecture(&codeOut);
    while(!inLecture.atEnd())
    {
        allLinesLecture << inLecture.readLine();
    }
    QStringList allLinesCommande;
    QTextStream inCommande(&codeIn);
    while(!inCommande.atEnd())
    {
        allLinesCommande << inCommande.readLine();
    }
    *avancement=15;
    QStringList DataLecture;
 
    for(int i = 1 ; i < allLinesLecture.count() ; i++)
    {
        QString CurrentLine(allLinesLecture[i]);
        QStringList CurrentLineSplit = CurrentLine.split(";");
 
        if(!allLinesLecture[i].contains("Err :"))
        {
            DataLecture << "('" + CurrentLineSplit[0] + "'," + CurrentLineSplit[1] +"," + "'OUT'" + "," + ID_Model + "," + CurrentLineSplit[3] + "," + "0)";
        }
    }
    *avancement=35;
    QCoreApplication::processEvents();
    QStringList DataCommande;
 
    for(int i = 1 ; i < allLinesCommande.count() ; i++)
    {
        QString CurrentLine(allLinesCommande[i]);
        QStringList CurrentLineSplit = CurrentLine.split(";");
 
        if(!allLinesCommande[i].contains("Err :"))
        {
            DataCommande << "('" + CurrentLineSplit[0] + "'," + CurrentLineSplit[1] +"," + "'IN'" + "," + ID_Model + "," + CurrentLineSplit[3] + "," + "0)";
        }
    }
    *avancement = 55;
    emit(avancement);
    importstatus=Integrate_Model_Variable_InBDD(DataLecture, db_m);
    if(importstatus==false)
    {
        qDebug() << "codeOut file has not been imported correctly";
    }
    *avancement=75;
    importstatus=Integrate_Model_Variable_InBDD(DataCommande, db_m);
    if(importstatus==false)
    {
        qDebug() << "codeIn file has not been imported correctly";
    }
    *avancement=100;
    qDebug() << "Fin Import Simulatio";
}
 
bool DataImporter::Integrate_Model_Variable_InBDD(QStringList ListData, DBManager *db_m)
{
    QString QueryInsertModelVariable = "INSERT INTO Model_Variables (name, id_Model_data_type, direction, id_Model, default_value, equipment_lv) VALUES";
    //QSqlQuery Query;
 
    int i = 0;
    bool result=true;
    int countline = 0;
    for (i=0;i <ListData.count(); i++)
    {
        if(result==true)
        {
            if (countline!=499 && i!=ListData.count()-1)
            {
                QueryInsertSPPVariable = QueryInsertSPPVariable + ListData[i]+"," ;
                countline++;
            }
            else if(countline==499 || i==ListData.count()-1)
            {
                QueryInsertSPPVariable = QueryInsertSPPVariable + ListData[i];
                //Query.prepare(QueryInsertSPPVariable);
                result = db_m->ExecuteQuery(QueryInsertSPPVariable);
                if (result ==false)
                {
                    qDebug() << "Problem while loading data in database";
                }
                QueryInsertModelVariable = "INSERT INTO Model_Variables (name, id_Model_data_type, direction, id_Model, default_value, equipment_lv) VALUES";
                countline = 0;
            }
        }
    }
    return result;
}
Mainwidget.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 MAINWIDGET_H
#define MAINWIDGET_H
 
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QProgressBar>
 
#include "UI\uiselectfilenameh.h"
#include "simulatioimporter.h"
#include "dbmanager.h"
 
class MainWidget : public QWidget
{
public:
    MainWidget(DBManager *db_m, QWidget *parent = 0);
    int avancement;
 
public slots:
    void LaunchImportSPP();
    void ProgressBarValue(int);
 
private:
    UISelectFileNameH *CodeIn;
    UISelectFileNameH *CodeOut;
    QPushButton *importModel;
    QProgressBar *ProgressBar;
    DBManager *db_t;
};
 
#endif // MAINWIDGET_H
Mainwidget.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
#include "mainwidget.h"
 
#include "UI\uiselectfilenameh.h"
#include "dbmanager.h"
 
MainWidget::MainWidget(DBManager *db_m, QWidget *parent) : QWidget(parent)
{
 
    //QWidget *MainWidget = new QWidget;
    CodeIn = new UISelectFileNameH("CodeLecture : ", this);
    CodeOut = new UISelectFileNameH("CodeCommande : ", this);
    avancement = 0;
 
    ProgressBar = new QProgressBar(this);
    ProgressBar->setMinimum(0);
    ProgressBar->setMaximum(100);
    ProgressBar->setValue(avancement);
 
    db_t=db_m;
 
 
    // définition des différents éléments graphiques
    importModel = new QPushButton(tr("Import Model"), this);
    importModel->setGeometry(62,40,75,30);
    importModel->setFont(QFont("Times", 14, QFont::Normal));
    connect(importModel,&QPushButton::clicked, this, &MainWidget::LaunchImportModel);
    // connections entre éléments
    //connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); // connection du bouton quit sur la fonction destruction de l'application
 
    QVBoxLayout *vlayout = new QVBoxLayout(this);
    vlayout->addWidget(CodeLecture);
    vlayout->addWidget(CodeCommande);
    vlayout->addWidget(ProgressBar);
    vlayout->addWidget(importSPP);
}
 
void MainWidget::LaunchImportModel()
{
    DataImporter SImport("STotoro STR21", "TestToToro",CodeOut->getFilePathName(), CodeIn->getFilePathName(), db_t, &avancement);
    QCoreApplication::processEvents();
}
 
void MainWidget::ProgressBarValue(int avancement)
{
    ProgressBar->setValue(avancement);
}