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

Qt Discussion :

Signaux et slot entre plusieurs objets


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut Signaux et slot entre plusieurs objets
    Bonjour.
    Je créer une classe A qui donne un objet A1 et une classe B qui donne un nombre indérterminnés ( B1, B2, B3....) d'objet. Je ne peux pas savoir combien il y aura d'objet de type B (pouvant dépasser la vingtaine, le nombre de B dépend des données introduites ) , par contre une certaine action sur ces objets de type B doit entrainer une action sur A1. Comment faut-il procédé pour arriver à ce résultat ?
    Les signaux et les slots connectent les objets entre eux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(B1, SIGNAL(signal partant de B), A1, SLOT(method agissant sur A);
    Dans mon cas j'ai plusieurs objets B, ils emettent chacun un signal en cas d'interaction , comment l'objet A1 peut-il le récupérer ?
    Autre précision importante la creation des objets B se fait à partir d'une méthode de A. Or connect est souvent appéle dans le constructeur ,mais dans mon cas c'est impossible car les objets n'existent pas encore.
    Donc je ne vois pas où serai l'endroit approprié dans le code pour mettre la ligne des connect

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Constructeur de la class A
    {   
        connect ( ); // ce connect est il valable pour l' objets B déclaré  plus bas ?
    }
     
    A::method()
    {
        B *b = new B();
    }

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Bonjour,

    Je pense que tu as un petit problème d'architecture, mais la question n'est pas là.

    Pourquoi ne fais tu pas le connect au niveau de ton constructeur d'objets B en passant ton pointeur de l'objet A en paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A::method()
    {
      B* b = new B(this);
    }
     
    B::B(A* a)
    {
       connect(this, <ton_signal_de_la_classe_B>, a, <ton_slot_de_la_classe_A>);
    }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Je n' ai jamais envisagé cette solution , je sais pas pourquoi . En tout cas merci je teste ça tout de suite

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    J'ai essayé ça :
    Ici le constructeur de B avec quelques methodes

    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
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    Node::Node(GraphWidget *graphWidget)
        : graph(graphWidget)
    {
        setFlag(ItemIsMovable);
        setFlag(ItemSendsGeometryChanges);
        setCacheMode(DeviceCoordinateCache);
        setZValue(-1);
        //setOpacity(0.10);
        nodeOpacity = false;
        bckColor = QColor(Qt::yellow);
        setArrivee(false);
        setDepart(false);
     
        connect(this, SIGNAL(choixStation(QString)), graph, SLOT(clickinfo(QString)));
    }
     
    void Node::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
    {
     
        update();
        QGraphicsItem::mouseDoubleClickEvent(event);
        //float opacite = this->opacity();    parle();
        emit choixStation(getnumeroStation());
     
     
     
     
    }
     
    void Node::choixStation(QString)
    {
     qDebug () <<"l'utilisateur clique sur la station ";             //juste pourt voir s'il y a bien emission du signal, apparament oui 
    }
    Le code compile mais il ne passe rien.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Tu peux développer un peu stp?

    Tu dis qu'il ne se passe rien mais dans ton code tu mets qu'il y a bien émission du signal... Je ne comprends pas trop ton problème du coup.

    Est-ce que tu peux montrer ton fichier d'en-tête?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    La méthode sur A (clickinfo) ne se lance pas. D'ailleurs même en la remplaçant par une méthode de B rien ne se passe , bien que le signal sois émis

    Je sais que le signal fonctionne car il lance un qdebug en même temps.

    voila à quoi ressemble l'entête

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    class Edge;
    class GraphWidget;
    QT_BEGIN_NAMESPACE
    class QGraphicsSceneMouseEvent;
    QT_END_NAMESPACE
     
     
     
    class Node : public QGraphicsObject
     
    {
     
    public:
        Node(GraphWidget *graphWidget);
        Node(GraphWidget *graphWidget, QColor qtColor);
        Node(GraphWidget *graphWidget, bool hsCoordinates);
     
        bool   arrivee;
        bool   depart;
     
        void addEdge(Edge *edge);
        QList<Edge *> edges() const;
     
     
     
     
     
     
    signals:
       // void choixStation(QString stationChoisie) ;
         void choixStation(QString);
     
     
    protected:
        QVariant itemChange(GraphicsItemChange change, const QVariant &value);
     
        void mousePressEvent(QGraphicsSceneMouseEvent *event);
     
        void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
     
        void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
      //  void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
        void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);
     
     
     
     
     
     
    //public slots:
    //bool  slotBtnClicked();
    public slots:
        void choixCheminement();
         //void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
     
     
     
     
    private:
        QList<Edge *> edgeList;
        QPointF newPos;
        GraphWidget *graph;
     
     
    };

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Je suis peut être bigleux mais je ne vois nul part la définition de ton slot (méthode) clickinfo...

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    La methode clickinfo ne fait pas partie de cette classe mais de la classe A (graphwidget)

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Est-ce que tu passes bien dans ta méthode mouseDoubleClickEvent? Est-ce que tu as essayé de debuger ton code?

    Edit: voici un petit example qui fonctionne très bien:
    A.hpp
    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
    #ifndef A_HPP
    #define A_HPP
     
    #include <QObject>
     
    class B;
     
    class A : public QObject
    {
      Q_OBJECT
    public:
      explicit A(QObject *parent = 0);
      virtual ~A();
    public slots:
      void messageReceived(const QString & message);
     
    private:
      B* m_b;
    };
     
    #endif // A_HPP
    A.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 "A.hpp"
    #include "B.hpp"
     
    #include <QDebug>
     
    A::A(QObject *parent) :
      QObject(parent)
    {
      m_b = new B(this, parent);
     
    }
     
    A::~A()
    {
      delete m_b;
    }
     
    void A::messageReceived(const QString &message)
    {
      qDebug() << message;
    }
    B.hpp
    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
    #ifndef B_HPP
    #define B_HPP
     
    #include <QObject>
    class A;
     
    class B : public QObject
    {
      Q_OBJECT
    public:
      explicit B(A* receiver, QObject *parent = 0);
     
    signals:
      void messageSend(const QString & message);
    };
     
    #endif // B_HPP
    B.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "B.hpp"
    #include "A.hpp"
     
    B::B(A *receiver, QObject *parent) :
      QObject(parent)
    {
      connect(this, SIGNAL(messageSend(QString)), receiver, SLOT(messageReceived(QString)));
      emit messageSend("Toto");
    }
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <QApplication>
     
    #include "A.hpp"
     
    int main(int argc, char *argv[])
    {
      QApplication a(argc, argv);
      A aa;
     
      return a.exec();
    }

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Merci pour ton aide, enfin résolu ! QgraphicsItem n'emet pas de signal car il n'hérite pas de QObject donc il faut utiliser à la place Qgraphicsobject et mettre un Q_OBJECT.
    je savais déjâ ça, mais comme il n'y avais pas d'erreur de compilation je pensais que le problème était ailleurs. La nouvelle syntaxe de Qt 5 pour faire des connect m'a un peu aidé aussi car elle ne compile pas si le signal n'est pas émis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(sender, &Sender::valueChanged,receiver, &Receiver::updateValue );
    Elle indique explicitement que mon objet B n'émet pas de signal. j'ai trouvé ça sur le blog de deux anciens devs de nokia/trolletch. http://woboq.com/blog/new-signals-sl...ax-in-qt5.html
    Dans mon cas ça a donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     connect(this, &Node::choixStation, graph, &GraphWidget::clickinfo );

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

Discussions similaires

  1. Partage d'un objet entre plusieur interface
    Par apocalypse dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2010, 22h13
  2. Réponses: 3
    Dernier message: 01/04/2010, 10h04
  3. [debutant] partage d'objet entre plusieurs
    Par xseillier dans le forum Websphere
    Réponses: 3
    Dernier message: 30/01/2009, 09h27
  4. Réponses: 6
    Dernier message: 09/11/2006, 10h29
  5. [POO] Conserver un objet PHP 5 entre plusieurs pages
    Par Invité dans le forum Langage
    Réponses: 24
    Dernier message: 20/05/2006, 14h13

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