Bonjour, je vais vous exposer mon problème en détail.
C'est surement assez simple mais je ne comprends pas.
Alors voilà J'ai une classe MainWindow dérivant de QMainWindow
J'ai une autre classe OptionWindow dérivant de QWidget
Le constructeur de OptionWindow prend en argument églament une MainWindow
ce qui me permettra d'avoir acces à ses attributs via des méthodes d'accesseurs.
Ensuite les attributs :
MainWindow possède un attribut QTextBrowser *qText.
OptionWindow possède un attribut QPushButton *launchB et un attribut
MainWindow *mainW;
La OptionWindow apparait lorsque l'utilisateur dans le menu de la MainWindow clic sur un onglet "Calcul"
Il doit alors rentrer des paramètres dans cette fenêtre et appuyer sur le bouton launchB pour lancer les calculs.
J'ai donc connecter le bouton et à un SLOT calcule() de OptionWindow comme ceci :
C'est dans ce SLOT calcule que j'aimerai lancer un thread faisant les calculs évidemment. Mais avant j'aimerais être capable de faire une chose plus simple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void OptionWindow::createActions() { connect(launchB, SIGNAL(clicked()), this, SLOT(calcule())); }
Pour l'instant le SLOT ce résume à
getQText() comme vous vous en doutez permet juste d'acceder au QTextBrowser de la MainWindow.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void OptionWindow::calcule() { mainW->getQText()->append("Lancement des calculs..."); }
Jusqu'ici tout va bien, cela marche et heureusement !
Je peux maintenant vous donner mon problème de Thread, imaginons qu'au lieu de lancer des calculs je veuille juste un Thread qui puisse écrire dans le QTextBrowser de la MainWindow
J'ai donc fait Une classe MyThread héritant de QThread dont voici le header :
Et voici le .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 #ifndef HEADER_MYTHREAD #define HEADER_MYTHREAD #include <QtCore\QThread> #include "MyThread.h" #include "MainWindow.h" class MyThread : public QThread { public: MyThread(MainWindow *mw, QObject* parent = NULL); virtual ~MyThread(); public slots: virtual void run(); signals: void ecrireInfo(); private: MainWindow *mwThread; }; #endif
Je peux donc ajouter des éléments dans mon SLOT calcule() de OptionWindow : (j'ai préalablement ajouter l'attribut MyThread *thread dans OptionWindow)
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 #include "MyThread.h" MyThread::MyThread(MainWindow* mw, QObject* parent): QThread(parent) { mwThread = mw; } MyThread::~MyThread() { exit(); wait(); } void MyThread::run() { emit ecrireInfo(); } void MyThread::ecrireInfo(){}
Donc En principe qd je lance le thread avec start(), cela appelle le run qui lui même est censé envoyer le signal ecrireInfo() qui ne fait rien, c'est juste un SIGNAL et apelle un SLOT ecrire()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void OptionWindow::calcule() { mainW->getQText()->append("Lancement des calculs..."); thread = new MyThread(mainW); connect(thread, SIGNAL(ecrireInfo()), this, SLOT(ecrire())); thread->start(); }
Le slot ecrire est simple, il est dans la classe OptionWindow et fait juste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void OptionWindow::ecrire() { mainW->getQText()->append("TEST"); }
Mais voilà, rien ne se passe.
Merci d'avance à qui prendra le temps de lire ce message.
Je débute et je sais que cela doit paraitre bien naif et que c'est surement très simple.
Partager