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 :

Cannot read property 'value' of undefined


Sujet :

Qt Quick

  1. #1
    Membre du Club
    Cannot read property 'value' of undefined
    Bonjour, je débute tout juste sur QML, et je voulais faire une petite application permettant de calculer l'imc et le poids ideal d'une personne.
    J'ai 2 pages.
    La première permet de saisir les infos utiles (sexe, taille, age, poids).
    La seconde affiche l'imc et la corpulence, et propose de calculer le poids idéal suivant 3 méthodes au choix.
    Mon problème est de mettre à jour les données d'une page en fonction des données de l'autre page


    Du coup j'ai 3 fichiers:
    + main.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
    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
     
    import QtQuick 2.9
    import QtQuick.Controls 2.2
     
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("Tabs")
     
        SwipeView {
            id: swipeView
            anchors.fill: parent
            currentIndex: tabBar.currentIndex
     
            Page1Form {
                switchSexe.onCheckedChanged{
                    if (switchSexe.text==="Femme")
                    {
                        switchSexe.text="Homme"
                    }
                    else
                    {
                        switchSexe.text="Femme"
                    }
                }
                sliderPoids.onValueChanged{
                    labelValPoids.text=sliderPoids.value;
                }
                sliderTaille.onValueChanged{
                    labelValTaille.text=sliderTaille.value;
                }
     
            }
     
            Page2Form {
            }
     
        }
     
        footer: TabBar {
            id: tabBar
            currentIndex: swipeView.currentIndex
     
            TabButton {
                text: qsTr("Informations Personnelles")
            }
            TabButton {
                text: qsTr("IMC et Poids idéal")
            }
            onCurrentIndexChanged{
                if (currentIndex===1)
                {
                    var imc;
                    var poids;
                    var taille;
                    poids=Page1Form.sliderPoids.value;
                    console.log(poids);
                    taille=Page1Form.sliderTaille.value;
                    imc=poids/(taille*taille);
                    Page2Form.labelIMC.text=imc;
                }
            }
        }
    }

    + Page1Form.ui.qml
    extrait:
    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
    35
    36
    37
    38
    39
    40
     
    Page {
        id: page1
        width: 600
        height: 400
        property alias page1: page1
        property alias spinBoxAge: spinBoxAge
        property alias labelValPoids: labelValPoids
        property alias labelValTaille: labelValTaille
        property alias sliderTaille: sliderTaille
        property alias sliderPoids: sliderPoids
        property alias switchSexe: switchSexe
     
    ...
     
            RowLayout {
                id: rowLayout5
                width: 100
                height: 100
     
                Label {
                    id: labelPoids
                    text: qsTr("Poids")
                }
     
                Slider {
                    id: sliderPoids
                    stepSize: 0.1
                    from: 15
                    to: 300
                    value: 15
                }
     
                Label {
                    id: labelValPoids
                    text: qsTr("15")
                }
            }        
        }
    }

    + Page2Form.ui.qml
    extrait:
    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
     
    Page {
        width: 600
        height: 400
        property alias buttonAge: buttonAge
        property alias buttonLorentz: buttonLorentz
        property alias buttonDevine: buttonDevine
        property alias labelPoidsIdeal: labelPoidsIdeal
        property alias dial: dial
        property alias labelIMC: labelIMC
        property alias labelCorpulence: labelCorpulence
     
       ...
     
                Text {
                    id: text1
                    text: qsTr("IMC")
                    font.pixelSize: 12
                }
                Label {
                    id: labelIMC
                    text: qsTr("IMCCalculée")
                }
            }
        }
    }


    Je passe bien dans mon code de test de la valeur de l'index courant, mais je n'arrive pas à récupérer le poids et la taille de Page1Form...
    Je m'y prend sûrement mal, quelqu'un peut il éclairer ma faible lanterne?

    Merci d'avance.

  2. #2
    Membre émérite
    L'erreur QML que tu as à l'exécution t'affiche normalement le fichier et la ligne où l'erreur s'est produite, avec ça tu devrais pouvoir comprendre rapidement le problème.

  3. #3
    Membre du Club
    Citation Envoyé par ymoreau Voir le message
    L'erreur QML que tu as à l'exécution t'affiche normalement le fichier et la ligne où l'erreur s'est produite, avec ça tu devrais pouvoir comprendre rapidement le problème.
    Oui, le problème vient de cette ligne du fichier main.qml:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    poids=Page1Form.sliderPoids.value;

    Mais je ne vois pas comment le résoudre.

  4. #4
    Membre émérite
    En QML (comme en C++) tu as besoin d'instances des objets, d'un côté tu déclares ton item QML dans Page1Form.ui.qml et de l'autre tu l'instancies dans ton main avec Page1Form { ... }
    Quand tu veux appeler les fonctions ou des propriétés de ton item tu dois le faire sur l'instance (sauf pour les membres/fonctions statiques, comme en C++). Or tu utilises le nom de classe et pas d'instance, sur la ligne qui est en erreur.

    Pour résoudre le problème :
    • Assigne un id à tes instances d'item Page1Form { id: page1 ... }
    • Utilise cet id pour appeler des fonctions ou propriétés poids=page1.sliderPoids.value;


    Si ce n'est pas clair, je te conseille de regarder les introductions de la doc Qt, et des exemples, pour bien comprendre comment on imbrique les items et ce que ça signifie au niveau objet.

  5. #5
    Membre du Club
    Merci!!
    super clair.
    ça marche impec!