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 :

Binding pour sous-item


Sujet :

Qt Quick

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Par défaut C++ et QML binding pour sous-item
    Bonjour, j'ai un probleme de binding C++/QML. Je n'arrive pas a binder un bouton(child element du root) avec un objet. J'y arrive avec le root mais pas le child. Voila le code C++:

    Code C++ : 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
     
    Q_DECL_EXPORT int main(int argc, char *argv[])
    {
        QScopedPointer<QApplication> app(createApplication(argc, argv));
        TimerObject timerObj;
        QDeclarativeView view;
        view.setResizeMode(QDeclarativeView::SizeRootObjectToView);
     
        view.setSource(QUrl("../Resources/qml/qmlcpp/main.qml"));
     
        QGraphicsObject* rootObj = view.rootObject();
        QDeclarativeItem *myButton = rootObj->findChild<QDeclarativeItem*>("mybutton");
     
        int height = myButton->height();
        QDeclarativeContext* ctxButton = qmlContext(myButton);
        ctxButton->setContextProperty("timer", &timerObj);
     
        return app->exec();
    }

    et le Qml :
    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
     
    // import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
    import QtQuick 1.1
     
    Rectangle {
        width: 360
        height: 360
        Text {
            y : 10;
            id:myText
            text: qsTr("Hello World")
            //anchors.centerIn: parent
        }
        MouseArea {
            anchors.fill: parent
            onClicked{
                //Qt.quit();
                //myText.text = timer.getCurrentDateTime();
                //myText.text = "toto";
            }
        }
     
        Button {
             id:mybutton
                anchors.centerIn:parent
                text: "Test Button"
                width: parent.width/2 -10
                objectName: "mybutton"
                onClicked{
                    console.log("Add folder clicked");
                    text= timer.getCurrentDateTime();
                }
            }
    }
    le TimerObject :
    Code C++ : 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
     
    #ifndef TIMEROBJECT_H
    #define TIMEROBJECT_H
    #include <QObject>
    #include <QDateTime>
     
    class TimerObject : public QObject
    {
     
     
        Q_OBJECT
        public:
        TimerObject();
        virtual ~TimerObject();
     
        Q_INVOKABLE QDateTime getCurrentDateTime() const {
            return QDateTime::currentDateTime();
        }
     
    };
     
    #endif // TIMEROBJECT_H

    Je rappelle bien que ca marche nickel si je bind le root au TimerObject avec :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        QDeclarativeContext *ctxt = view.rootContext();
        ctxt->setContextProperty("timer", &timerObj);

    Merci d'avance

  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
    Bonsoir,

    Je ne vois pas vraiment ce que vous souhaitez faire dans la pratique (quel est le résultat attendu, par exemple). Cependant, au cas où cela pourrait vous éclairer :

    http://louis-du-verdier.developpez.c...communication/

    Bonne soirée,
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Par défaut
    Bonsoir, comme explique je cherche a binder une propriété a mon bouton uniquement. Si je clique sur le bouton je veux lancer une procédure particulière.
    Je ne veux pas le faire sur la root, car je vais avoir plusieurs sous-elements et seuls certains doivent être bindes.
    Votre lien je l'ai déjà étudié, il explique comment parcourir l'arborescence QML mais il n'explique pas comment régler mon souci.

    Cordialement

  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,

    Cela signifie donc que la ligne qui pose problème est :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    QDeclarativeContext* ctxButton = qmlContext(myButton);

    Est-ce que qmlContext fait l'équivalent de QDeclarativeEngine::contextForObject(myButton) ?

    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Par défaut
    voila tu a tout compris, je me doutais bien que le problème venait de cette ligne, mais ca ne marche pas non plus avec :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        QDeclarativeContext* ctxButton = QDeclarativeEngine::contextForObject(myButton);
       // QDeclarativeContext* ctxButton = qmlContext(myButton);
        ctxButton->setContextProperty("timer", &timerObj);

  6. #6
    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,

    Qu'entendez-vous par "ça ne marche pas" ? Une erreur QML se produit lors du clic sur le bouton (timer not found), l'application cesse de fonctionner (segfault), problème de compilation ?

    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

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Par défaut
    bonsoir, oui il me dit timer not found.
    Je vois pas comment corriger ça...

    cordialement

  8. #8
    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,

    Pour ma part, je ne vois que deux solutions, si celle énoncée plus tôt ne fonctionne pas :
    • Passer par le rootContext() au lieu du contextForObject() afin de set la property à au contexte root pour que tous les éléments y aient accès du côté de QML (cela implique qu'il n'y ait pas besoin de plus d'une contextProperty - ou du moins, qu'on en ait un nombre fixe et pré-déterminable) ;
    • Ajouter l'élément TimerObject à QML avec qmlRegisterType de façon à avoir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Button {
        id: mybutton
        anchors.centerIn:parent
        text: "Test Button"
        width: parent.width / 2 - 10
     
        TimerObject { id: timer }
     
        onClicked{
            console.log("Add folder clicked");
            text = timer.getCurrentDateTime();
        }
    }
    Après, s'il s'agit uniquement de récupérer le currentDateTime(), passer par un petit peu de JS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    onClicked{
        var d = new Date();
        text = Qt.formatDateTime(d, Qt.DefaultLocaleShortDate);
    }
    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

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Par défaut
    bonjour, pour la solution JS on va oublier, car c est juste un test pour essayer le binding.

    Passer par le root context je sais que ça marche j avais déjà essayer mais je cherchait une solution plus encapsulée. Merci pour le tuyau du qmlRegisterType.
    Du coup QDeclarativeEngine::contextForObject() et qmlContext ça sert à quoi au final?
    Un exemple peut-être d utilisation pratique?

    Cordialement

  10. #10
    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,

    Apparemment, qmlContext(QObject *) fait la même chose que [C++]QDeclarativeEngine::contextForObject(QObject *)[/C]. J'ai vu quelques utilisations où les développeurs l'utilisent pour remonter au rootContext() :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QDeclarativeContext *context = QDeclarativeEngine::contextForObject(this);
    context->engine()->rootContext()->setContextProperty("anotherBody", anotherBody);

    De là, je n'ai pas testé d'utiliser cette fonction donc je ne peux rien vous dire de plus.

    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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Par défaut
    très bien merci. Ce n est pas encore tout a fait clair pour moi vu que je débute, mais le rootContext est accessible directement depuis la declarativeView, ce cas d'utilisation pour remonter au rootContext doit être fait dans un cas particulier.
    Je serais intéressé d avoir le code source du projet ou vous avez trouvé ces lignes de code.
    merci d avance

  12. #12
    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
    Citation Envoyé par kaiser92 Voir le message
    Je serais intéressé d avoir le code source du projet ou vous avez trouvé ces lignes de code.
    https://bitbucket.org/jtoivola/qml-physics/wiki/Home
    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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/03/2007, 17h58
  2. [XML] PARSE XML avec multi donnée pour un item ?
    Par gandolfi dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 15/03/2007, 14h58
  3. Réponses: 1
    Dernier message: 26/10/2006, 17h44
  4. Réponses: 4
    Dernier message: 29/09/2006, 11h53
  5. Context menu Windows - icone pour un item
    Par Cameleon45 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 07/03/2003, 13h48

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