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ération des propriétés courantes des composants QML


Sujet :

Qt Quick

  1. #1
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut Récupération des propriétés courantes des composants QML
    Bonjour,

    Afin de pouvoir effectuer un log d'un état courant de l'affichage d'une IHM QML, ou de pouvoir sauvegarder ou restaurer un certain affichage, ou autre utilisation, j'aimerais accéder à un temps t aux propriétés courantes des objets QML présent dans mon IHM, c'est à dire les choses configurables avec un fichier statique : x, y, width, height, mais aussi les anchors, les enfants et leurs propriétés etc. En effet l'IHM est dynamique et affiche des composants selon les désirs de l'utilisateur. Un peu à la sauce du QML Designer par exemple mais différent dans le sens où les composants prennent directement vie via component.createObject.

    Côté C++, j'accède au parent principal via
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    mainView->rootObject()->findChild<QObject*>("QMLWindow");

    Mon problème est que je suis bloqué car quand j'analyse les propriétés je tombe sur des Variant bizarres et nouveaux pour moi difficiles à exploiter via
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const QMetaObject* metaObject = p_object->metaObject();
    QString attName = metaObject->property(indexProperty).name();
            QVariant attValueVariant = p_object->property(metaObject->property(indexProperty).name());
            QString attValueTypeName = p_object->property(metaObject->property(indexProperty).name()).typeName();

    comme par exemple
    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
    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
     
    "parent"  :  QVariant(QDeclarativeItem*, ) 
    "parent" "QDeclarativeItem*" 
    "data"  :  QVariant(QDeclarativeListProperty<QObject>, ) 
    "data" "QDeclarativeItem*" 
    QStandardItem::setChild: Ignoring duplicate insertion of item 0x1d3d1dd8
    "resources"  :  QVariant(QDeclarativeListProperty<QObject>, ) 
    "resources" "QDeclarativeItem*" 
    QStandardItem::setChild: Ignoring duplicate insertion of item 0x1d3d1dd8
    "states"  :  QVariant(QDeclarativeListProperty<QDeclarativeState>, ) 
    "states" "QDeclarativeListProperty<QDeclarativeState>" 
    "transitions"  :  QVariant(QDeclarativeListProperty<QDeclarativeTransition>, ) 
    "transitions" "QDeclarativeListProperty<QDeclarativeTransition>" 
    "state"  :  QVariant(QString, "") 
    "state" "" 
    "childrenRect"  :  QVariant(QRectF, QRectF(0,0 46x18) ) 
    "childrenRect" "QRectF" 
    "anchors"  :  QVariant(QDeclarativeAnchors*, ) 
    "anchors" "QDeclarativeAnchors*" 
    "left"  :  QVariant(QDeclarativeAnchorLine, ) 
    "left" "QDeclarativeAnchorLine" 
    "right"  :  QVariant(QDeclarativeAnchorLine, ) 
    "right" "QDeclarativeAnchorLine" 
    "horizontalCenter"  :  QVariant(QDeclarativeAnchorLine, ) 
    "horizontalCenter" "QDeclarativeAnchorLine" 
    "top"  :  QVariant(QDeclarativeAnchorLine, ) 
    "top" "QDeclarativeAnchorLine" 
    "bottom"  :  QVariant(QDeclarativeAnchorLine, ) 
    "bottom" "QDeclarativeAnchorLine" 
    "verticalCenter"  :  QVariant(QDeclarativeAnchorLine, ) 
    "verticalCenter" "QDeclarativeAnchorLine" 
    "baseline"  :  QVariant(QDeclarativeAnchorLine, ) 
    "baseline" "QDeclarativeAnchorLine" 
    "baselineOffset"  :  QVariant(double, 0) 
    "baselineOffset" "0" 
    "clip"  :  QVariant(bool, false) 
    "clip" "false" 
    "focus"  :  QVariant(bool, false) 
    "focus" "false" 
    "activeFocus"  :  QVariant(bool, false) 
    "activeFocus" "false" 
    "transform"  :  QVariant(QDeclarativeListProperty<QGraphicsTransform>, ) 
    "transform" "QDeclarativeListProperty<QGraphicsTransform>" 
    "transformOrigin"  :  QVariant(int, 4) 
    "transformOrigin" "4" 
    "transformOriginPoint"  :  QVariant(QPointF, QPointF(0, 0) ) 
    "transformOriginPoint" "QPointF" 
    "smooth"  :  QVariant(bool, false) 
    "smooth" "false" 
    "implicitWidth"  :  QVariant(double, 0) 
    "implicitWidth" "0" 
    "implicitHeight"  :  QVariant(double, 0) 
    "implicitHeight" "0"

    En fait, je ne vois pas comment exploiter ça, je pense que je suis dans une mauvaise solution pour sérialiser / désérialiser mes objets QML dynamiques présents.
    J'ai vu que QML Designer faisait directement une modif sur le fichier en cours de design pour s'en sortir, mais moi ça passe par la mémoire.

    Comment procéder pour arriver à récupérer les propriétés exploitables en temps courant des objets dynamiques présents sur une IHM QML présent dans un rootObject ?

    Par avance, je vous remercie pour la moindre piste qui me ferait avancer

  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
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonsoir,

    Il est tout d'abord à savoir que QVariant est une classe utilisée pour représenter un conteneur de base de tous les types de données utilisables dans les fichiers QML. Quand vous créer un Item {}, vous créer un QDeclarativeItem* (la classe de base des éléments graphiques de QML), contenu dans un QVariant. Cela explique les types que vous obtenez.

    Dans le cas des données que vous récupérez, vous parcourez les propriétés via le méta-objet. De ce fait, vous obtenez ceci. Cependant, si vous connaissez déjà tous les types de données (QString, QDeclarativeItem*, bool, etc.), vous pouvez faire une lecture approfondie et afficher ce que vous voulez voir. Ce n'est pas très clair ; je vous montre :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    QString name = QString(metaObject->property(indexProperty).name());
    QVariant data = p_object->property(name);
     
    if (data.typeName() == "QDeclarativeItem*" && data.canConvert<QDeclarativeItem*>()) {
        QDeclarativeItem* item = data.value<QDeclarativeItem *>(data);
        qDebug() << name << ": [" << item->objectName();
        << ";" << item->metaObject()->className();
        << ";" << item->x();
        << ";" << item->y()
        << "]";
    }

    Cela donnera par exemple :

    "parent" : [ "mainWidget" ; "QDeclarativeItem" ; 56 ; 48 ]
    Je ne sais pas si c'est réellement ce que vous souhaitez ; je reste à votre disposition pour toute question supplémentaire.

    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 actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Merci pour la réponse

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 21/02/2010, 23h08
  2. Réponses: 4
    Dernier message: 22/01/2010, 17h36
  3. Grouper des objets partageant des propriétés
    Par camboui dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 06/04/2006, 19h01
  4. Réponses: 3
    Dernier message: 24/10/2005, 16h32
  5. recopie des propriétés d'un composant
    Par pitounette dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/02/2004, 10h40

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