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 :

Récupérer une donnée QML en C++


Sujet :

Qt Quick

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Récupérer une donnée QML en C++
    Bonjour,
    Depuis quelques jours j'essaie de récupérer une variable que j'obtiens en QML dans une classe C++.
    Ma valeur se trouvant dans un type component, j'essaie de la récupérer avec la fonction findChild() mais sans succès.

    Code QML : 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
                        ColumnLayout {
                            Repeater {
                                model: _activeVehicle ? _activeVehicle.batteries : 0
     
                                ColumnLayout {
                                    spacing: 0
     
                                    property var batteryValuesAvailable: valueAvailableLoader.item
     
                                    Loader {
                                        id:                 valueAvailableLoader
                                        sourceComponent:    batteryValuesAvailableComponent
     
                                        property var battery: object
                                    }
    objectName: test
                                    property int voltage:   10
                                }
                            }
                        }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        QQmlEngine engine;
        QQmlComponent component(&engine, QUrl("qrc:/testBat.qml"));
        QObject *object = component.create();
        QObject *item = object->findChild<QObject *>("test");
     
        qDebug() << "Property value:" << QQmlProperty::read(item, "voltage").toInt();
    Je débute encore en Qt, si vous avez une idée de comment je pourrais récupérer ma valeur.
    Merci !

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 597
    Points
    188 597
    Par défaut


    La doc (https://doc.qt.io/qt-5/qtqml-cppinte...mlfromcpp.html) suggère une autre approche, un peu plus légère syntaxiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qDebug() << "Property value:" << item->property("someNumber").toInt();
    Ton code n'est pas super robuste, puisque findChild peut renvoyer un nullptr quand aucun objet avec ce nom n'existe. Je suppose que ton problème vient du fait que tu déréférences un pointeur nullptr, mais je ne fais que supposer, puisque tu n'indiques pas exactement ton problème (ce que fait ton code que tu ne souhaites pas).

    Peut-être dois-tu être plus précis dans l'appel à findChild ? Intuitivement, je dirais que ce n'est pas nécessaire, mais ça ne peut pas faire de mal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QQuickItem *item = view.rootObject()->findChild<QQuickItem*>("myRect");
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Salut, merci pour ta réponse. J'utilise l'appli QGroundControl pour piloter drones et voitures et j'aimerai créer une interface avec un graphique qui affiche ma tension en fonction du temps. Le problème est que j'arrive uniquement à récupérer la valeur de la tension dans un fichier QML. J'essai donc de passer cette valeur dans ma classe c++ qui me permet de tracer mon graph pour pouvoir l'actualiser.

    Pour le findChild(), j'ai modifié mon code en utilisant une condition if pour vérifier si il me renvoi qqchose. Le probleme est qu'il me renvoi uniquement nullptr, je pense qu'il ne trouve pas mon objectName mais je ne suis pas sur.
    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
    QQmlApplicationEngine engine;
        QQmlComponent component(&engine, QUrl("qrc:/testBat.qml"));
        QObject *object = component.create();
        QObject *item = object->findChild<QObject *>("testObject");
     
        int v;
     
        if (item) {
          qDebug() << "Ok";
          v = 20;//Valeur de test //QQmlProperty::read(object,"volt").toInt();
        }
        else {
          qDebug() << "Rien";
          v=5;
        }
     
        qDebug() << "Property value:" << QQmlProperty::read(object, "volt").toInt();
    Concernant l'utilisation de QQuickView, mon application crash qq secondes après son ouverture sans message d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        QQuickView view;
        view.setSource(QUrl("qrc:/testBat.qml"));
        QQuickItem *item = view.rootObject()->findChild<QQuickItem*>("testObject");
        qDebug() << "Property value:" << item->property("voltage").toInt();
    Dans ce context, findChild() cherche bien un objectName (ici testObject) ? Ou je fais fausse route sur son utilisation ?

    Merci pour ton aide ! :)

Discussions similaires

  1. Réponses: 27
    Dernier message: 19/09/2006, 09h51
  2. Réponses: 11
    Dernier message: 13/07/2006, 16h15
  3. [VB6] Comment récupérer une donnée à travers un activeX ?
    Par ferry.jules dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/06/2006, 10h55
  4. Réponses: 1
    Dernier message: 18/04/2006, 23h16
  5. [EJBQL] Récupérer une donnée dans un EJB avec EJB/QL
    Par pblb62 dans le forum Java EE
    Réponses: 3
    Dernier message: 28/03/2006, 11h53

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