IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Appeler une méthode de la classe parente à partir d'une classe fille

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut Appeler une méthode de la classe parente à partir d'une classe fille
    Bonjour,

    J'ai une classe A principale qui appel une méthode de la classe B, cette méthode de la classe B est un slot,
    mais dans dans cette methode sLOT, je voudrais appeler une methode de la classe A.

    Methode de la classe A que je doit appelé: la classe A s'appele Dialog c'est l'application principale.
    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
     
    bool Dialog::isMenuChecked(const QString &actionName)
    {
        bool checked;
        QAction *action = findChild<QAction *>(actionName);
     
        checked = false;
     
        if(action)
        {
            if(actionName == action->objectName())
                checked = action->isChecked();
            qDebug() << tr("actionname: %1 objectname: %2").arg(actionName).arg(action->isChecked());
        }
     
        return checked;
    }
    quand je l'appelle a partir de la classe Dialog elle fontionne parfaitement.

    Methode slot de la classe B(MyServer) qui doit appele isMenuCheck qui se trouve dans la classe A(Dialog).

    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
     
    void MyServer::handleSlotResponse(const QString text, QColor color)
    {
        if(qte_resp)
        {
           Dialog *d = qobject_cast<Dialog *>(pParent);
     
            if(d->isMenuChecked("hideresp") == false)
            {
                qDebug() << "ok";
                qte_resp->setTextColor(color);
                qte_resp->append(text);
            }
        }
    }
    La methode est bien appelé mais la variable QAction action de la methode isMenuCheck est a null, alors que ca fonctionne lorsqu'elle est appelée directement à partir de la classe Dialog.
    QAction *action = findChild<QAction *>(actionName);

    j'ai essaye via la declaration statique de isMenuCheck mais ca ne marche pas car j'utilise l'objet QAction dans cette methode.


    Avez vous une idée ?

    Merci de votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    la variable pParent etait pas initialisee, j'ai donc declare server comme MyServer *server et dans le constructeur de MyServer j'ai fait ceci:
    server = new MyServer(this);

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    salut,
    Citation Envoyé par andromeda Voir le message
    la variable pParent etait pas initialisee, j'ai donc declare server comme MyServer *server et dans le constructeur de MyServer j'ai fait ceci:
    server = new MyServer(this);
    Heuu... attend, attends, attends...

    Pourrais tu nous donner la définition complète des deux classes que tu utilises et surtout la relation qui existe entre les deux ?

    Car j'ai un très gros doute sur ce que tu fais... : Si je lis bien entre les lignes, tu es occupé à créer une relation "client / serveur", et cela ne me pose aucun problème. Sauf que, si je continue à lire entre les lignes, tu demande au client de créer un serveur... qui est sensé déjà exister. Et ca, ca ne me semble vraiment pas être une bonne idée, car cela signifie que chaque client aura son serveur qui lui est propre. Tu vois un peu le problème

    Alors, je suis tout à fait d'accord que le client doit disposer "d'un moyen d'accéder au client". Et encore, normalement, il devrait y avoir "quelque chose" (je sais pas, moi, pourquoi pas une notion de "connection") qui prendrait place entre les deux.

    Mais le propre d'une architecture client / serveur (sauf cas très particuliers), c'est d'avoir un serveur pour plusieurs clients et non un serveur par client.

    L'idée est donc que tu dois veiller à transmettre (au travers du constructeur) un pointeur sur ton serveur à ton client pour que le constructeur de ton client puisse initialiser correctement la variable correspondante

    Mais je le répète : normalement, il y a très certainement "quelque chose" qui s’intercale entre le client et le serveur. Et c'est à ce "quelque chose" que le client devrait s'adresser
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    En fait j'ai procédé comme on on le fait souvent en C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class A {
     
    private:
     static A *_pSelf;
    };
    dans le cpp de la classe A en haut du source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A *A::_pSelf = NULL;
    dans le constructeur de A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    A::A(QWidget *parent)
        : QWidget(parent)
    {   
        A::_pSelf = qobject_cast<A*>(this);
    ....
    je creer une methode public dans la class A dans le A.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public:
        static A *getInstance() {
            return _pSelf;
        }
    maintenant je peux l'utiliser de la facon suivante dans n'importe quel classe en mettant #include "A.h"
    A::getinstance()-> .....
    en tous cas ce system est valable pour n'importe quel classe de travail.

    cela dit j'ai fait comme tu as dit:
    "Mais le propre d'une architecture client / serveur (sauf cas très particuliers), c'est d'avoir un serveur pour plusieurs clients et non un serveur par client."
    "L'idée est donc que tu dois veiller à transmettre (au travers du constructeur) un pointeur sur ton serveur à ton client pour que le constructeur de ton client puisse initialiser correctement la variable correspondante"

    je recupere dans le constructeur de la classe B une variable pointeur sur a classe A que j'initialise dans le constructeur de la classe B.

    B.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class B {
    private:    
        QObject *pParent;
     
    QObject * getParent() const {
            return pParent;
        }
     
    A *getMainWndDlg()  {
            return qobject_cast<A*>(getParent());
     
    };
    B.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    B::B(QObject *parent)    
    {
        pParent = parent;
    }
    dans la methode de la classe B je peux appeler une methode de la classe A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(getMainWndDlg()->isMenuChecked("hidedata") == false)
            {
               .....
            }
    isMenuChecked() est une methode de la classe A.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Ouh là là!!!! Mais tu n'as aucun besoin d'avoir recours à self_, vu que tu as déjà this qui pointe sur l'instance courante de la classe!

    En plus, ce que tu fais là se rapproche de l'anti pattern singleton-->souffrirais tu de singletonite aigue

    Fais hériter ta classe A de QWidget (parce que, d'après l'implémentation de ton constructeur, c'est ce qui arrive, alors que la définition de ta classe ne l'indique pas), et basta!

    Ensuite, dans ta classe B, tu crées un pointeur A* sur l'objet créé, non pas un pointeur sur un QObject, comme cela, tu n'as même plus à t'emmerder avec les casts inutiles

    Et, comme je présume -- peut-être à tord -- que ta classe A sera responsable de la création des instances de type B, tu as très certainement une fonction membre (je sais pas moi, quelque chose comme createB(/* paramètres*/)) dans ta classe A qui te permet de transmettre this au constructeur de B (qui doit, bien sur, s'attendre à obtenir un paramètre sous la forme d'un A* )

    Ne crois tu pas que tout cela serait beaucoup plus simple
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 19/03/2014, 18h45
  2. Réponses: 2
    Dernier message: 20/06/2012, 09h27
  3. Réponses: 2
    Dernier message: 02/12/2009, 11h36
  4. Réponses: 1
    Dernier message: 24/09/2008, 12h31
  5. [MFC] Classe MFC à partir d'une TypeLib
    Par annedjomo dans le forum MFC
    Réponses: 10
    Dernier message: 15/11/2004, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo