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 :

Slots QML : typage des arguments


Sujet :

Qt Quick

  1. #1
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut Slots QML : typage des arguments
    Bonjour,

    J’ai un soucis que je rencontre en faisant interagir du code C++ et du QML.

    Quand je déclare un signal QML, tout va bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    signal unSignal(int unParametre);
    Côté C++, pas de soucis pour une connexion avec un slot void(int).

    Par contre, pour les slots QML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function unSlot(unArg /* qui est un int */) {}
    Problème : je ne peux connecter cela qu’avec un signal(QVariant), mais j’aimerais le connecter avec un signal(int).

    Y a-t-il moyen de préciser côté QML la signature réelle de mon slot, afin de pouvoir faire les connexions comme il se doit et sans passer par des QVariant (je me fiche que ça utilise des QVariant en interne, je souhaiterai par contre ne pas dégrader la signature de tous mes signaux ou me taper des adaptateurs juste pour ça) ?

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Ici, on parle de fonction JavaScript et de signal QML. Le fait de déclarer deux signaux avec le même nom est censé déclencher une erreur.

    Pour un signal nommé "unSignal", le "slot" est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ItemQuelconque {
        // ...
        signal unSignal(string value)
        // ...
        onUnSignal{ doSomething(value); }
    }
    Après, à ce niveau, value est considéré comme étant de type string, si je ne me trompe pas. Sinon, il y a toujours moyen de faire String(value).

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par Amnell Voir le message
    Bonjour,

    Ici, on parle de fonction JavaScript et de signal QML.
    Merci, mais ça ne répond pas vraiment à mon problème .

    Sur mon composant Qml, si je déclare une fonction javascript, elle est automatiquement disponible comme slot. Problème : ses arguments ne sont pas typés. Alors pour les signaux il y a une syntaxe qui permet de typer…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Item
    {
       function unSlot(arg)
       {}
       signal valueChanged(int theValue);
    }
    et côté cpp :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Toto
    {public slots:
       void autreSlot(int);
    signals:
       void sig1(int);
       void sig2(QVariant);
    }

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* item est une référence vers mon item Qml */
    QObject::connect(item, SIGNAL(valueChanged(int)), toto, SLOT(autreSlot(int))); // OK
    QObject::connect(toto, SIGNAL(sig1(int)), item, SLOT(unSlot(int))); // NOK : no such slot (1)
    QObject::connect(toto, SIGNAL(sig1(int)), item, SLOT(unSlot(QVariant))); // NOK : signatures incompatibles (2)
    QObject::connect(toto, SIGNAL(sig2(QVariant)), item, SLOT(unSlot(QVariant))); // OK

    Mon problème, c’est que j’aimerai un moyen pour que (1) ou (2) fonctionne.

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonsoir,

    La connexion signal(QVariant) à jsFunction(QVariant) va fonctionner vu que les fonctions QML sont considérées comme prenant en paramètre des QVariant. À savoir que QVariant garde le type() et la value() qu'on lui a assigné, il n'y a aucun risque de perte de données. De là, ce n'est pas possible de faire une connexion en int to QVariant par rapport au système de métaobjets qui n'est pas conçu pour (vu que, si je ne me trompe pas, un connect() travaille avec du char* puis du QMetaObject::invokeMethod() et non directement avec des pointeurs sur fonction - Qt doit donc trouver un moyen de vérifier la validité de la connexion et une compatibilité des arguments).

    À noter qu'il n'est pas "propre" de faire une connexion du C++ à une fonction du QML du fait que cela casse complètement la raison pour laquelle QML applique le principe MVC. Ce que je peux vous proposer : Communication entre QML et C++/Qt.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Merci pour la réponse, ce n’est donc bien pas possible.

    Citation Envoyé par Amnell Voir le message
    À noter qu'il n'est pas "propre" de faire une connexion du C++ à une fonction du QML du fait que cela casse complètement la raison pour laquelle QML applique le principe MVC. Ce que je peux vous proposer : Communication entre QML et C++/Qt.
    Ok. Perso, je ne vois pas ce que ça casse (j’ai une classe métier, une classe d’interface, et de la glu au milieu, qu’elle soit côté c++ ou qml ne change de mon point de vue conceptuellement pas grand chose), mais si c’est fait pour faire comme ça, autant s’adapter.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/03/2006, 10h37
  2. taille max des arguments en ligne de commande
    Par clepape dans le forum Langage
    Réponses: 2
    Dernier message: 08/10/2005, 13h18
  3. Réponses: 6
    Dernier message: 16/06/2005, 10h45
  4. Réponses: 2
    Dernier message: 15/02/2005, 14h18
  5. Réponses: 9
    Dernier message: 29/07/2003, 14h41

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