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 Quick Discussion :

Liaison entre des signaux et des slots C++ et QML


Sujet :

Qt Quick

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant-Benevole pour Electronic-MasterX
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Islande

    Informations professionnelles :
    Activité : Etudiant-Benevole pour Electronic-MasterX
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Points : 44
    Points
    44
    Par défaut Liaison entre des signaux et des slots C++ et QML
    Bien le Bonsoir, j'essaie de lier un signal d'une classe fille de QOject que j'utilise comme composant QML, avec une classe fille de QWidget. j'ai fait tous les tests possibles et m'assurer de déterrer toutes les erreurs mais jusqu'ici je n'ai pas trouvé mon erreur. je me suis aussi assuré que le signal provenant du composant QML etait bien declenché mais c'est au niveau de connect que ça flanche d'une façon qui m'est inconnue et surtout il n'y'a aucune erreur.

    voici le code pour une illustration

    Code qt : 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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    // la classe message est celle du composant QML 
    class Message: public QObject
    {
        Q_OBJECT
        Q_PROPERTY(Status status READ status WRITE setStatus NOTIFY statusChanged)
        Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged)
        public:
            explicit Message();
            enum Status {
                NotFound,
                Found
            };
            Q_ENUM(Status)
           Status status() const
            {
                return m_status;
            }
            QString message() const
            {
                return m_msg;
            }
            void setMessage(QString message)
            {
                m_msg = message;
                qDebug("ici set message");
                emit messageChanged(message);
                qDebug("emission reussi");
            }
     
            Q_INVOKABLE void affiche()
            {
                qDebug("j'affiche ici");
            }
     
            void setStatus(Status status)
            {
                m_status = status;
                emit statusChanged(status);
            }        
     
        signals:
            void statusChanged(Status);
            void messageChanged(QString);
        public slots:
            void change(bool a);
    //        void mess(QString);
     
    public:
            Status m_status;
            QString m_msg;
     
    };
     
    #endif // MESSAGE_H
     
     
    //voici la class héritant de QWidget
     
    class Gamer : public QWidget
    {
        Q_OBJECT
    public:
        explicit Gamer(QWidget *parent = nullptr);
        void initialise(); // crée la liste de mot de depart
        QStringList randomChoice(); // tire 8nombre au hazard et renvoit les Lettres de l'alphabet correpondante
        QStringList generateName(QStringList init); // genere tous les noms possibles à partir des huits lettres et les renvoit sous forme de Liste
        void checkForRandomName(QStringList foundInit); // recupere la liste generee et recupere les nombres appartenant aux dictionnaires et sauvegarde le tout dans m_foundInit
     
     
    signals:
        QString foundName(bool a); // se declenche quand l'utilisateur saisir un nom correct de la liste
        QStringList generateNameCompleted(QStringList init); // se declenche quand la generation de nom à partir du Random choice se termine
        QStringList initCompleted(QStringList init); // se declenche quand l'initialisation de la liste se termine
     
     
     
     
    public slots:
        bool checkForName(const QString &name);
        void mess(QString);
     
    private:
        QStringList m_init;
        QStringList m_foundInit;
        Message *m_msg;
    };
     
    #endif // GAMER_H
     
     
    //et voici l'implementation de son constructeur 
     
    Gamer::Gamer(QWidget *parent) : QWidget(parent)
    {
        Q_UNUSED(parent);
        m_msg = new Message;
        m_msg->change(true);
        m_init = QStringList();
        m_foundInit = QStringList();
        connect(this, &Gamer::foundName, m_msg, &Message::change);
        connect(m_msg, &Message::messageChanged, this, &Gamer::checkForName);
        connect(m_msg, SIGNAL(messageChanged(QString)), this, SLOT(mess(QString)));
    }


    je vous remercie pour vos reponses

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Si j'ai bien compris c'est donc la classe Message qui est utilisé comme un composant QML. Pourtant dans votre code il n'apparaît nulle part l'utilisation de Message depuis QML.
    Les connexions signal/slot paraissent correctes, par contre je ne vois pas comment l'objet Message *m_msg va générer des signaux étant donnée qu'il n'est utilisé nulle part (d'après le code visible).

    Quand vous dites que Message est un composant QML, s'agit-t'il d'un composant que l'on peut créer depuis QML ?
    J'ai l'impression que le but est plutôt de partagé une instance de Message et la rendre accessible depuis QML.

    je me suis aussi assuré que le signal provenant du composant QML etait bien declenché
    Serais-ce possible de voir le code ou le signal est déclenché?

  3. #3
    Membre du Club
    Homme Profil pro
    Etudiant-Benevole pour Electronic-MasterX
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Islande

    Informations professionnelles :
    Activité : Etudiant-Benevole pour Electronic-MasterX
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    je vous remercie de votre interet à la discussion mais j'ai résolu ce problème en QQmlContext. j'ai regardé dans le forum de Qt et là j'ai vu que cette façon de procéder était encore sujet au bug bien que les syntaxes soient juste. et en fait dans mon code QML, j'avais en effet une instance de Message qui n'apparait pas dans ce que j'ai envoyé. Mais ceci dit, c'est n'est plus important!. Pour les personnes qui se retrouveront un jour en face de cette discussion, j'ai mis sur mon Git une façon plus convenable de gérer celle liaison signal, slot entre les protagonistes.

    il suffit de visiter le projet Anagramme dans main.cpp y'a la mise en place dans et scan.qml j'en ai fait plusieurs utilisations. Anagramme

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/10/2014, 15h13
  2. reconstitution des signaux à partir des trames
    Par jena dans le forum Signal
    Réponses: 0
    Dernier message: 21/10/2012, 22h28
  3. Gérer l'affichage des fenêtres avec des signaux
    Par flomanson dans le forum Débuter
    Réponses: 10
    Dernier message: 09/09/2011, 13h48
  4. Réponses: 3
    Dernier message: 13/09/2007, 18h11
  5. Réponses: 3
    Dernier message: 23/01/2007, 08h14

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