Exécuter une méthode parent depuis un enfant
Bonjours à tous
Débutant en Qt et C++ je m'affronte à un problème de hiérarchie.
Je m'explique :
J'ai une classe parent (issue d'un QMainWindow) qui possède un 'public slot'
la classe :
Code:
class FenetreAppli : public QMainWindow
le slot :
Code:
void renameFile(QString leRep="", QString oldName="", QString newName="");
qui se déclenche sur un item de menu (vous l'aurez compris, le but est de renommer un fichier,
dont on passe le nom du dossier ainsi que l'ancien et nouveau nom, ou qui les demande s'ils ne sont pas transmis).
Je créé un enfant
Code:
class Editeur : public QWidget
dont le constructeur est :
Code:
Editeur(QWidget *parent, QString nomRubDir);
créé par :
Code:
1 2 3
| Editeur *fenEdit = new Editeur(m_zoneCentrale, nomRuban);
QMdiSubWindow *sousFenetre1 = m_zoneCentrale->addSubWindow(fenEdit);
sousFenetre1->show(); |
(à savoir que m_zoneCentrale est un QMdiArea et nomRuban un éventuel nom de fichier).
qui possède un
Code:
QObject::connect(rubanEditer, SIGNAL(triggered()), this, SLOT(editRub()));
j'aimerais appeler le slot "renameFile" depuis le slot editRub() de ma classe 'Editeur'
Hors 'Editeur' ne connait pas ce slot, même avec un
Code:
parent->renameFile(m_nomRep,m_nomRuban,nomRuban);
Pouvez-vous m'aider pour appeler un slot (ou même une méthode 'public') depuis une classe enfant ?
Merci d'avance
Philippe
Exécuter une méthode parent depuis un enfant
Bonjour Iradrille
Merci pour ta réponse ( ... tardive ... je vois que tu n'es pas un couche-tôt :mouarf: )
Je me suis servi de tes conseils, et après les avoir un peu adaptés, j'y suis arrivé :ave:
Voici ce que j'ai écrit dans mon FenetreAppli.h :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include "Editeur.h"
class FenetreAppli : public QMainWindow
{
public:
FenetreAppli();
/* ... */
public slots:
void renameFile(QString leRep="", QString oldName="", QString newName="");
private:
QMdiArea *m_zoneCentrale;
/* ... */
}; |
Voici ce que j'ai écrit dans mon FenetreAppli.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include "FenetreAppli.h"
FenetreAppli::FenetreAppli()
{
m_zoneCentrale = new QMdiArea;
/* ... */
}
void FenetreAppli::renameFile(QString leRep, QString oldName, QString newName)
{
/* ... */
}
// lancement de l'editeur depuis FenetreAppli :
Editeur *fenEdit = new Editeur(this, m_zoneCentrale, nomRuban);
QMdiSubWindow *sousFenetre1 = m_zoneCentrale->addSubWindow(fenEdit);
sousFenetre1->show(); |
Voici ce que j'ai écrit dans mon Editeur.h :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| class Editeur : public QWidget
{
/* ... */
public:
Editeur(QMainWindow *fen, QWidget *parent =0, QString nomRubDir ="");
public slots:
void renommeRuban();
signals:
void renommeFichier(QString rep="", QString oldNom="", QString newNom="");
/* ... */
} |
Voici ce que j'ai écrit dans mon Editeur.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include "Editeur.h"
Editeur::Editeur(QMainWindow *fen, QWidget *parent, QString nomRubDir) :
QWidget(parent), m_fenA(fen)
{
/* ... */
QObject::connect(m_btnRenommeR, SIGNAL(clicked()), this, SLOT(renommeRuban()));
// m_btnRenommeR est un pointeur sur un QPushButton
QObject::connect(this, SIGNAL(renommeFichier(QString, QString, QString)), m_fenA, SLOT(renameFile(QString, QString, QString)));
/* ... */
void Editeur::renommeRuban()
{
/* ... */
emit renommeFichier(m_nomRep, m_nomRuban, nouveauNom);
// m_nomRep et m_nomRuban sont des attributs et nouveauNom une variable renseignée précédemment
/* ... */
}
} |
Le fonctionnement :
FenetreAppli créé un Editeur dans une sous-fenêtre,
lorsque le bouton de l'Editeur est cliqué, le slot de l'Editeur est appelé et déclenche son signal qui active le slot de FenetreAppli
(dont le pointeur est passé en paramètre du constructeur de l'Editeur).
Je n'ai pas passé une référence à FenetreAppli au constructeur de l'Editeur car il aurait fallut inclure FenetreAppli.h dans Editeur.h,
hors FenetreAppli.h inclus déjà Editeur.h ..... inclusions en boucle .... ça me chagrine ...
Mais vu que FenetreAppli est une classe dérivée d'un QMainWindow, je passe un pointeur de QMainWindow et hop ... le tour est joué.
Merci beaucoup pour ton aide :ccool:
Je part à la conquète d'autres problèmes.
Philippe