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 :

Échec de cast d'une classe fille de QObject en QObject

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut Échec de cast d'une classe fille de QObject en QObject
    Bonjour,

    Je peine depuis un beau bout de temps à trouver ce qui ne va pas avec un cast d'une classe fille de QObject en Qbject.

    Plus en détail, j'ai un classe A qui hérite de QObject et de B. La classe a contient entre autres une map QMap<QString, QPropertyAnimation*> (je la cite car c'est avec elle où ça ne va pas). J'ai connecté le signal de destruction de A à un slot qui tente d'accéder à la map par son getter. Et c'est que ça chauffe : mon cast (avec static_cast) marche (pointeur non NULL) mais la map est inaccessible. Pourquoi ?

    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
     
         class B
         {
             ...
         };
     
         class A : public QObject, public B
         {
               Q_OBJECT
     
               public:
                    A() : m_propertiesAnimation("prop", new QPropertyAnimation), B()
                    {
                    }
     
                    QMap<QString, QPropertyAnimation*> getPropertiesAnimation()
                    {
                           return m_propertiesAnimation;
                    }
     
               private:
                       QMap<QString, QPropertyAnimation*> m_propertiesAnimation;  
         };
    La connexion du signal de destruction, je l'a fais dans une autre classe C ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
               A * variable_A = new A();
               connect(variable_A, SIGNAL(destroyed(QObject*)),
                    this, SLOT(remove(QObject*)), Qt::UniqueConnection);
    Le slot dans lequel la map est inaccessible (les autres propriétés de ma classe ne le sont pas par contre) est :
    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 C::remove(QObject *ai_item)
    {
        A * a0 = qobject_cast<A*>(ai_item);   // CE CAST NE MARCHE PAS => NULL
        if (a0 != NULL)
        {
            qWarning() << a0->getPropertiesAnimation();
        }
     
       A * a1 = static_cast<A*>(ai_item);   // CE CAST MARCHE
        if (NULL != a1)
        {
             qWarning() << a1->getPropertiesAnimation(); // ERREUR de segmentation
        }
    }
    Merci pour toute aide !

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Est-ce que tu est sûr que ton objet est toujours vivant à la réception de ton signal ?

    Tu n'es pas dans un thread par hasard ?

    Que se passe-t-il si tu utilises une connection directe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect( ... , Qt::Directconnection)

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    L'objet est vivant puisque le pointeur reçu n'est pas NULL. C'est le cast qui cause problème je pense !

    Sinon, j'ai utilisé Directconnection mais sans succès, le static_cast marche mais la map est inaccessible !

    Merci pour réaction.

    Autre chose, en mode debug, j'ai une erreur de : RTTI symbol not found for class 'QObject'. dès que je tente d'accéder à la map !

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Citation Envoyé par hisoft Voir le message
    Autre chose, en mode debug, j'ai une erreur de : RTTI symbol not found for class 'QObject'. dès que je tente d'accéder à la map !
    Ah ben oui ! C'est normal

    Ce qu'il se passe c'est que lors de la destruction, les destructeurs sont appellés en ordre inverse de la construction.

    Donc le destructeur de A est appelé : il détruit la map !
    Ensuite celui de QObject (ou de B mais peu d'importance) est appellé : émission du signal destroyed(). Mais A n'existe plus, donc il est impossible d'accéder la map de l'objet. Seulement les fonctions de QObject seront accèssibles

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    Je ne te suis pas là. Je capte le signal émis par A lorsque A est sur le point d'être détruit (mais pas encore). Le slot que j'exécute lors de l'émission du signal doit donc trouver A non encore détruit puisque c'est ça l'utilité du destroyed() de A !

    Donc A ne doit être détruit qu'à la fin de l'exécution du slot. D'ailleurs, si tel n'était pas le cas, les autres variables membres de A seraient également perdues !

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    Tu as effectivement raison : j'ai créé un destructeur bidon pour A et il est bien appelé avant le slot. Mais c'est quoi alors la solution ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/05/2006, 19h05
  2. Appel de fonction depuis une classe fille
    Par lhpp dans le forum Interfaces Graphiques en Java
    Réponses: 8
    Dernier message: 26/04/2006, 22h02
  3. Réponses: 8
    Dernier message: 22/03/2006, 18h24
  4. Héritage d'un événement pour une classe fille
    Par korntex5 dans le forum Langage
    Réponses: 4
    Dernier message: 11/01/2006, 16h48
  5. [debutant]appeller une fonction d'une classe fille et mere ?
    Par Battosaiii dans le forum Débuter
    Réponses: 1
    Dernier message: 12/11/2005, 12h56

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