Bonjour,
je vais tenter de vous exposer brièvement mon problème.
J'ai une classe mère (nommée ClasseMere) qui étend de QFrame, et une classe fille (nommée ClasseFille, qui étend donc de ClasseMere).
Les classes filles sont construites selon les directives de la classe mère et possèdent des attributs qu'il est nécessaire de sauvegarder avant fermeture.
Pour se faire, je comptais implémenter la modélisation suivante :
La classe mère :
- étend QFrame
- possède un slot virtuel "void saveAndClose()"
- redirige le signal d'un bouton fermer vers le slot virtuel "void saveAndClose()"
La classe fille :
- étend de la classe mère et propose ses propres attributs (à sauvegarder)
- implémente le slot virtuel "void saveAndClose()" décrivant la manière de sauvegarder les données, et ferme la fenêtre.
Voici à quoi ressemble ma classe mère (.h):
et son .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 #include <QtGui> class ClasseMere : public QFrame { Q_OBJECT public: ClasseMere(QWidget *parent=0); virtual ~ClasseMere(); void initialiseFenetre(); public slot: virtual void saveAndClose() = 0; protected: virtual void initialiseContenuFenetre() = 0; //Contient les pointeurs vers les principaux éléments graphiques (Layouts, Widgets, Boutons, ect...) }
Voici les fichiers de la classe fille : (.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 ClasseMere::ClasseMere(QWidget *parent):QFrame(parent) { initialiseFenetre(); //bouton close est un pointeur vers le bouton (QPushButton) permettant la fermeture de la fenêtre QObject::connect(bouton_close, SIGNAL(clicked()), this, SLOT(saveAndClose()); } ClasseMere::~ClasseMere() { } ClaseeMere::initialiseFenetre() { //Création des éléments graphiques //... //... }
Et son .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 class ClasseFille : public ClasseMere { Q_OBJECT ClasseFille(QWidget *parent = 0); virtual ~ClasseFille(); public slot: void saveAndClose(); //Implémente de la classe mère protected: void initialiseContenuFenetre(); //Implémente de la classe mère //Contient les pointeurs vers les principaux éléments graphiques de la classe fille (Layouts, Widgets, Boutons, ect...) }
La compilation se déroule bien, l'erreur arrive à l'exécution :
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 ClasseFille::ClasseFille(QWidget *parent):ClasseMere(parent) { initialiseContenuFenetre(); } ClasseFille::~ClasseFille() { } ClasseFille::initialiseContenuFenetre() { //Construction des éléments graphique de la classe fille //... //... } ClasseFille::saveAndClose() { //Sauvegarde des infos //... //... this->close(); }
Object::connect: No such slot QFrame::saveAndClose()
2 soucis :
1) Je ne comprends pas pourquoi on cherche le slot saveAndClose() dans la classe QFrame alors que l'élément présent dans mon connect est bien une instance de la ClasseMere.
Rappel :
QObject::connect(bouton_close, SIGNAL(clicked()), this, SLOT(saveAndClose());
2) Peut-être existe-t-il un autre moyen d'arriver à la fin souhaitée (appeler une méthode perso lors de la fermeture de la fenêtre, j'ai tenté d'exploité le signal "destroyed" de QFrame, mais celui-ci survient après la destruction, donc le contenu à exploité est perdu.
Cette méthode me parait la plus propre pour créer plusieurs Classe filles différentes proposant chacune leurs propres éléments. Ici, il ne suffit que d'implémenter la construction de la fenêtre et la façon de sauvegarder les éléments dans la classe fille.
Partager