Bonjour,
avant de commencer à expliquer mon problème je précise que j'ai cherché sur le forum et aussi sur la doc officielle mais je ne trouve pas ma solution (enfin pas exactement).
J'ai une classe abstraite qui hérite de QObject :
Voilà une classe abstraite dont devra hériter un object pour envoyer des signaux à un contrôleur.
C'est le contrôleur qui va se connecter à cette classe abstract. Cette classe n'a donc pas connaissance du contrôleur.
Le contrôleur possède un pointeur vers cette classe Abstract et y réalise ses connexions.
Le contrôleur tout comme cette classe Abstract doivent hériter de QObject pour être connectés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class Abstract : public QObject { Q_OBJECT public : Abstract(QObject*parent = 0); virtual ~Abstract(); virtual void mustBeImplemented(void) = 0; signals : void aRandomSignal(void); };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class Ui_MainWindow { // générée par Qt Designer };
Ici, c'est la classe à laquelle le contrôleur veut se connecter pour être le destinataire d'un signal.
Dans ce cas de figure, cette classe hérite de QMainWindow qui hérite lui même de QObject.
La classe hérite aussi de la classe Abstract et donc une deuxième fois de QObject.
Je ne peux pas modifier QMainwindow afin de faire de l'héritage virtuel de QObject.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class MainWindow : public QMainWindow, public Abstract { Q_OBJECT public : MainWindow (QObject*parent = 0); ~MainWindow (); void mustBeImplemented(void) { emit aRandomSignal(); // here I am implemented } private : Ui_MainWindow* ui; };
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 class controller : public QObject { Q_OBJECT public : controller (QObject*parent = 0); ~controller (); void setAbstract(Abstract *abstract) { // if abstract not null deconnect from it // connect to the new one connect(abstract, SIGNAL(aRandomSignal()), this, SLOT(aRandomSlot())); } public slots : void aRandomSlot(void) { // do something } private : Abstract *abstract; };
Voilà, quelle est la solution à ce problème ?
J'ai pensé à faire de la classe MainWindow un wrapper de QMainwindow et de modifier en conséquence ce qui va bien pour la classe Ui_MainWindow, entre autre :
Avant
Après (avoir mis un membre QMainwindow *win)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); initializeWidgets(); createConnections(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 MainWindow::MainWindow(QWidget *parent) : win(new QMainwindow(parent)), ui(new Ui::MainWindow) { ui->setupUi(win); initializeWidgets(); createConnections(); }
Partager