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); }
Partager