Bonjour,
J'aimerais savoir quelle serait le code pour faire en sorte qu'une QProgressBar puisse s'activer (valeur modifiée) pendant qu'une autre tâche s'effectue dans le main (une tâche assez longue) ?
Il faudrait que l'application soit ne soit pas "freezé" (le but des QThreads), mais quand j'enlève le "QCoreApplication::processEvents();", mon application se freeze...

Voici le code (que je pense est incorrecte quelque part car je n'ai jamais utilisé QThread et je n'ai pas trouvé de documentation appropriée dans mon cas à part des forums) :
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
#ifndef DEF_Q_S_THREAD_HPP
#define DEF_Q_S_THREAD_HPP
 
#include <QApplication>
#include <QCoreApplication>
#include <QThread>
#include <QWaitCondition>
 
class QSThread : public QThread
{
    Q_OBJECT
 
    public:
 
        // Constructeur/Destructeur
        QSThread(QObject *parent = 0);
        ~QSThread();
 
        // -----------------------------------------------------------------------------------------------------------------
 
        // Méthode de lancement
        void run();
 
 
    private:
 
        // Attributs privés
        int m_value;
        QWaitCondition m_wait_condition;
 
 
    signals:
 
        // Signal qui modifie la progression de la progressBar
        void setValue(int value);
};
 
#endif //DEF_Q_S_THREAD_HPP
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
#include "QSThread.hpp"
 
// Constructeur
QSThread::QSThread(QObject *parent) : QThread(parent)
{
    // initialisation de l'attribut m_valeur
    m_value = 0;
}
 
// Destructeur
QSThread::~QSThread()
{}
 
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
 
// Méthode de lancement
void QSThread::run()
{
    while(1)
    {
        m_value += 5;
        //m_mutex.unlock();
 
        // vérification de la nouvelle valeur
        if(m_value >= 100)
            m_value = 0;
 
        // changement de valeur
        emit setValue(m_value);
        QCoreApplication::processEvents();
        m_wait_condition.wait();
    }
}

et voici la progressBar :
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
#ifndef DEF_Q_S_PROGRESS_BAR_HPP
#define DEF_Q_S_PROGRESS_BAR_HPP
 
#include <QProgressBar>
#include "QSThread.hpp"
 
class QSProgressBar : public QProgressBar
{
    Q_OBJECT
 
    public:
 
        // Constructeur/Destructeur
        QSProgressBar(QWidget *parent = 0);
        ~QSProgressBar();
 
        // -----------------------------------------------------------------------------------------------------------------
 
        // Méthodes de lancement de chargement
        void startLoading();
        void stopLoading();
 
    private:
 
        // Thread principale
        QSThread m_thread;
};
 
#endif //DEF_Q_S_PROGRESS_BAR_HPP
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
#include "QSProgressBar.hpp"
 
// Constructeur
QSProgressBar::QSProgressBar(QWidget *parent) : QProgressBar(parent)
{
    // configuration de la progressBar
    setValue(0);
    setTextVisible(false);
 
    // connexion des signaux
    connect(&m_thread, SIGNAL(setValue(int)), this, SLOT(setValue(int)));
}
 
// Destructeur
QSProgressBar::~QSProgressBar()
{}
 
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
 
// Met en route le chargement
void QSProgressBar::startLoading()
{
    m_thread.start(QThread::HighestPriority	);
}
 
// Stoppe le chargement
void QSProgressBar::stopLoading()
{
    m_thread.exit();
    setValue(0);
}