2016-05-12 1 views
1

Je suis confronté à un problème de chargement de délégués dynamiques avec des modèles dynamiques utilisant les chargeurs. Je suis en mesure de voir le délégué du modèle correspondant, mais les données de ce délégué ne sont pas affichées. En cliquant sur le bouton, obtenir l'erreur "ReferenceError: « : le nom n'est pas défini » J'ai posté l'exemple complet en dessous Quelqu'un pourrait-il suggérer si je manque quelque choseLes données ne sont pas récupérées pour les délégués dynamiques avec des modèles dynamiques dans QML

import QtQuick 2.3 
import QtQuick.Window 2.2 

Window { 
    id: mainWindow 

    property int value: 0 
    property variant m_Model: modelData 

    visible: true 
    height: 600 
    width: 700 


    Row{ 
     id: mainButtons 
     spacing: 5 
     anchors.top: parent.top 
     anchors.left: parent.left 
     anchors.margins: 6 


     Rectangle{ 
      id: b1 
      height: 50 
      width: 90 
      border.width: 1 
      radius: 3 
      color: "skyblue" 
      Text{ 
       anchors.centerIn: parent 
       text: "Button1" 
      } 
      MouseArea{ 
       anchors.fill: parent 
       hoverEnabled: true 
       onClicked:{ 
        listView.model=button1Model 
        value=1 
       } 
      } 
     } 
     Rectangle{ 
      id: b2 
      height: 50 
      width: 90 
      border.width: 1 
      radius: 3 
      color: "skyblue" 
      Text{ 
       anchors.centerIn: parent 
       text: "Button2" 
      } 
      MouseArea{ 
       anchors.fill: parent 
       hoverEnabled: true 

       onClicked: { 
        listView.model=button2Model 
        //listView.delegate=b2Delegate 
        //loader.sourceComponent=b2Delegate 
        value=2 
       } 
      } 
     } 
     Rectangle{ 
      id: b3 
      height: 50 
      width: 90 
      border.width: 1 
      radius: 3 
      color: "skyblue" 
      Text{ 
       anchors.centerIn: parent 
       text: "Button3" 
      } 
      MouseArea{ 
       anchors.fill: parent 
       hoverEnabled: true 

       onClicked: { 
        listView.model=button3Model 
        value = 3 
       } 
      } 
     } 
    } 

    ListView{ 
     id: listView 

     anchors.top: mainButtons.bottom 
     anchors.left:parent.left 
     anchors.margins: 3 

     height: 500 
     width: 600 

     model: modelData 

     delegate: Component{ 
      id: loader 
      Loader{ 
       id: loader 

       sourceComponent: { 
        switch(value) 
        { 
        case 1: { 
         return b1Delegate 
        } 
        case 2:{ 
         return b2Delegate 
        } 
        case 3:{ 
         return b3Delegate 
        } 
        default: 
         return listDelegate 

        } 

       } 
      } 
     } 
    } 

    Component{ 
     id: listDelegate 
     Row{ 

      spacing: 5 
      Rectangle{ 
       width: 100 
       height: 50 
       border.width: 1 
       Text{ 
        anchors.centerIn: parent 
        text: name 
       } 
      } 

      Rectangle{ 
       width: 100 
       height: 50 
       radius: 50 
       border.width: 1 
       Text{ 
        anchors.centerIn: parent 
        text: number 
       } 
      } 
     } 

    } 


    ListModel{ 
     id: modelData 

     ListElement{ 
      name: "abc" 
      number: "1" 
     } 
     ListElement{ 
      name: "def" 
      number: "2" 
     } 
     ListElement{ 
      name: "ghi" 
      number: "3" 
     } 
     ListElement{ 
      name: "jkl" 
      number: "4" 
     } 
    } 

    Component{ 
     id: b1Delegate 

     Row{ 
      spacing: 5 
      anchors.margins: 5 

      Rectangle{ 
       height: 50 
       width: 100 
       border.width: 1 
       Text{ 
        anchors.centerIn: parent 
        text: SerialNO 
       } 

      } 
      Rectangle{ 
       height: 50 
       width: 100 
       border.width: 1 
       Text{ 
        anchors.centerIn: parent 
        text: Name 
       } 

      } 
      Rectangle{ 
       height: 50 
       width: 100 
       border.width: 1 
       Text{ 
        anchors.centerIn: parent 
        text: Marks 
       } 

      } 
     } 
    } 

    ListModel{ 
     id: button1Model 
     ListElement{ 
      SerialNO: "1" 
      Name: "Mathametics" 
      Marks: "100" 
     } 
     ListElement{ 
      SerialNO: "2" 
      Name: "Science" 
      Marks: "75" 
     } 
     ListElement{ 
      SerialNO: "3" 
      Name: "Social" 
      Marks: "80" 
     } 
     ListElement{ 
      SerialNO: "4" 
      Name: "Hindi" 
      Marks: "80" 
     } 
     ListElement{ 
      SerialNO: "5" 
      Name: "English" 
      Marks: "75" 
     } 

    } 

    ListModel{ 
     id: button2Model 
     ListElement{ 
      Name: "ABC" 
     } 
     ListElement{ 
      Name: "XYZ" 
     } 
     ListElement{ 
      Name: "PQR" 
     } 
     ListElement{ 
      Name: "IJK" 
     } 
    } 
    ListModel{ 
     id: button3Model 
     ListElement{ 
      University: "AAAAAA" 
      Address: "111111" 
     } 
     ListElement{ 
      University: "BBBBBB" 
      Address: "111111" 
     } 
     ListElement{ 
      University: "CCCCCC" 
      Address: "111111" 
     } 
     ListElement{ 
      University: "DDDDDD" 
      Address: "111111" 
     } 
    } 

    Component 
    { 
     id: b2Delegate 
     Row{ 
      spacing: 5 
      anchors.margins: 5 
      Rectangle{ 
       height: 50 
       width: 100 
       border.width: 1 
       Text{ 
        anchors.centerIn: parent 
        text: Name 
       } 

      } 
     } 
    } 

    Component 
    { 
     id: b3Delegate 
     Row{ 
      spacing: 5 
      anchors.margins: 5 

      Rectangle{ 
       height: 50 
       width: 100 
       border.width: 1 
       Text{ 
        anchors.centerIn: parent 
        text: University 
       } 

      } 
      Rectangle{ 
       height: 50 
       width: 100 
       border.width: 1 
       Text{ 
        anchors.centerIn: parent 
        text: Address 
       } 

      } 
     } 
    } 
} 
+0

Salut Mitch, Oui Je reçois la même erreur. Comment résoudre cette erreur parce que je suis capable de voir le composant de délégué. – user1540436

+0

Mon modèle complet et délégué dans un fichier qml unique uniquement. Je n'ai pas beaucoup en C++. Veuillez trouver le code C++ ci-dessous. #include #include int main (int argc, char * argv []) { app QGuiApplication (argc, argv); Moteur QQmlApplicationEngine; engine.load (QUrl (QStringLiteral ("qrc: /main.qml"))); return app.exec(); } – user1540436

+0

Mon mauvais. J'ai supprimé mes commentaires. – Mitch

Répondre

0

Je pense que.. . en utilisant un Loader tout en fixant un delegate est pas une bonne idée Essayez de changer ceci:

delegate: Component{ 
    id: loader 
    Loader{ 
     id: loader 

     sourceComponent: { 
      switch(value) 
      { 
      case 1: { 
       return b1Delegate 
      } 
      case 2:{ 
       return b2Delegate 
      } 
      case 3:{ 
       return b3Delegate 
      } 
      default: 
       return listDelegate 

      } 

     } 
    } 
} 

à ceci:

delegate: { 
    switch(value) 
    { 
    case 1: { 
     return b1Delegate 
    } 
    case 2:{ 
     return b2Delegate 
    } 
    case 3:{ 
     return b3Delegate 
    } 
    default: 
     return listDelegate 
    } 
} 

I Si cela ne vous aide pas, veuillez éditer votre réponse et joindre un exemple de code complet. L'exemple que vous avez fourni contient des erreurs et je ne sais pas lesquelles se produisent à cause d'un exemple trop court, et qui sont en fait des erreurs.

+1

@Hazubski: J'ai posté l'exemple de code complet ci-dessus. Mon scénario dans l'exemple ci-dessus est que j'ai une vue liste avec le modèle par défaut et le délégué, quand je clique sur le bouton (bouton 1/bouton 2/bouton 3), alors il a un modèle différent et un délégué sélectionnez en conséquence. Si j'ai essayé d'assigner manuellement onClicked: { – user1540436

+0

Si j'ai essayé d'assigner manuellement onClicked: {listView.model = button1Model loader.sourceComponent = b1Delegate } Je reçois un RefereError de boutons précédents qrc:/main .qml: 200: ReferenceError: le nom n'est pas défini qrc: /main.qml: 210: ReferenceError: les marques ne sont pas définies – user1540436

0

Les données du modèle doivent être rendues visibles à la portée du délégué. Vous pouvez le faire dans un similar way as Qt Quick Controls does it:

delegate: Loader { 
    property string nameData: name 
    property int numberData: number 

    sourceComponent: { 
     switch (value) { 
     case 1: 
      return b1Delegate 
     case 2: 
      return b2Delegate 
     case 3: 
      return b3Delegate 
     default: 
      return listDelegate 
     } 
    } 
} 

Ensuite, listDelegate deviendrait:

Component { 
    id: listDelegate 
    Row { 
     spacing: 5 

     Rectangle { 
      width: 100 
      height: 50 
      border.width: 1 
      Text { 
       anchors.centerIn: parent 
       text: nameData 
      } 
     } 

     Rectangle { 
      width: 100 
      height: 50 
      radius: 50 
      border.width: 1 
      Text { 
       anchors.centerIn: parent 
       text: numberData 
      } 
     } 
    } 
} 

est ici le bon code (j'ai simplifié certaines d'entre elles):

import QtQuick 2.3 
import QtQuick.Window 2.2 

Window { 
    id: mainWindow 

    property int value: 0 
    property variant m_Model: modelData 

    visible: true 
    height: 600 
    width: 700 

    Row { 
     id: mainButtons 
     spacing: 5 
     anchors.top: parent.top 
     anchors.left: parent.left 
     anchors.margins: 6 

     Rectangle { 
      id: b1 
      height: 50 
      width: 90 
      border.width: 1 
      radius: 3 
      color: "skyblue" 
      Text { 
       anchors.centerIn: parent 
       text: "Button1" 
      } 
      MouseArea { 
       anchors.fill: parent 
       hoverEnabled: true 
       onClicked: { 
        listView.model = button1Model 
        value = 1 
       } 
      } 
     } 
     Rectangle { 
      id: b2 
      height: 50 
      width: 90 
      border.width: 1 
      radius: 3 
      color: "skyblue" 
      Text { 
       anchors.centerIn: parent 
       text: "Button2" 
      } 
      MouseArea { 
       anchors.fill: parent 
       hoverEnabled: true 

       onClicked: { 
        listView.model = button2Model 
        //listView.delegate=b2Delegate 
        //loader.sourceComponent=b2Delegate 
        value = 2 
       } 
      } 
     } 
     Rectangle { 
      id: b3 
      height: 50 
      width: 90 
      border.width: 1 
      radius: 3 
      color: "skyblue" 
      Text { 
       anchors.centerIn: parent 
       text: "Button3" 
      } 
      MouseArea { 
       anchors.fill: parent 
       hoverEnabled: true 

       onClicked: { 
        listView.model = button3Model 
        value = 3 
       } 
      } 
     } 
    } 

    ListView { 
     id: listView 

     anchors.top: mainButtons.bottom 
     anchors.left: parent.left 
     anchors.margins: 3 

     height: 500 
     width: 600 

     model: modelData 

     delegate: Loader { 
      property string nameData: name 
      property int numberData: number 

      sourceComponent: { 
       switch (value) { 
       case 1: 
        return b1Delegate 
       case 2: 
        return b2Delegate 
       case 3: 
        return b3Delegate 
       default: 
        return listDelegate 
       } 
      } 
     } 
    } 

    Component { 
     id: listDelegate 
     Row { 
      spacing: 5 

      Rectangle { 
       width: 100 
       height: 50 
       border.width: 1 
       Text { 
        anchors.centerIn: parent 
        text: nameData 
       } 
      } 

      Rectangle { 
       width: 100 
       height: 50 
       radius: 50 
       border.width: 1 
       Text { 
        anchors.centerIn: parent 
        text: numberData 
       } 
      } 
     } 
    } 

    ListModel { 
     id: modelData 

     ListElement { 
      name: "abc" 
      number: "1" 
     } 
     ListElement { 
      name: "def" 
      number: "2" 
     } 
     ListElement { 
      name: "ghi" 
      number: "3" 
     } 
     ListElement { 
      name: "jkl" 
      number: "4" 
     } 
    } 

    Component { 
     id: b1Delegate 

     Row { 
      spacing: 5 
      anchors.margins: 5 

      Rectangle { 
       height: 50 
       width: 100 
       border.width: 1 
       Text { 
        anchors.centerIn: parent 
        text: SerialNO 
       } 
      } 
      Rectangle { 
       height: 50 
       width: 100 
       border.width: 1 
       Text { 
        anchors.centerIn: parent 
        text: Name 
       } 
      } 
      Rectangle { 
       height: 50 
       width: 100 
       border.width: 1 
       Text { 
        anchors.centerIn: parent 
        text: Marks 
       } 
      } 
     } 
    } 

    ListModel { 
     id: button1Model 
     ListElement { 
      SerialNO: "1" 
      Name: "Mathametics" 
      Marks: "100" 
     } 
     ListElement { 
      SerialNO: "2" 
      Name: "Science" 
      Marks: "75" 
     } 
     ListElement { 
      SerialNO: "3" 
      Name: "Social" 
      Marks: "80" 
     } 
     ListElement { 
      SerialNO: "4" 
      Name: "Hindi" 
      Marks: "80" 
     } 
     ListElement { 
      SerialNO: "5" 
      Name: "English" 
      Marks: "75" 
     } 
    } 

    ListModel { 
     id: button2Model 
     ListElement { 
      Name: "ABC" 
     } 
     ListElement { 
      Name: "XYZ" 
     } 
     ListElement { 
      Name: "PQR" 
     } 
     ListElement { 
      Name: "IJK" 
     } 
    } 
    ListModel { 
     id: button3Model 
     ListElement { 
      University: "AAAAAA" 
      Address: "111111" 
     } 
     ListElement { 
      University: "BBBBBB" 
      Address: "111111" 
     } 
     ListElement { 
      University: "CCCCCC" 
      Address: "111111" 
     } 
     ListElement { 
      University: "DDDDDD" 
      Address: "111111" 
     } 
    } 

    Component { 
     id: b2Delegate 
     Row { 
      spacing: 5 
      anchors.margins: 5 
      Rectangle { 
       height: 50 
       width: 100 
       border.width: 1 
       Text { 
        anchors.centerIn: parent 
        text: Name 
       } 
      } 
     } 
    } 

    Component { 
     id: b3Delegate 
     Row { 
      spacing: 5 
      anchors.margins: 5 

      Rectangle { 
       height: 50 
       width: 100 
       border.width: 1 
       Text { 
        anchors.centerIn: parent 
        text: University 
       } 
      } 
      Rectangle { 
       height: 50 
       width: 100 
       border.width: 1 
       Text { 
        anchors.centerIn: parent 
        text: Address 
       } 
      } 
     } 
    } 
} 
+0

Merci pour l'aide, Pouvez-vous s'il vous plaît suggérer si je dois utiliser le modèle au lieu d'assigner tous les variables séparément comment puis-je le faire. – user1540436

+0

Merci pour l'aide, pouvez-vous s'il vous plaît suggérer si je dois utiliser le modèle au lieu d'assigner toutes les variables séparément comment puis-je le faire. je veux dire à l'intérieur du chargeur, mon exigence est comme je vais utiliser seulement certaines variables en fonction du type de délégué, maintenant que je déclare toutes les variables dans le chargeur je reçois le même problème que précédemment, mais pour moins de variables . S'il vous plaît suggérer comment nous pouvons assigner directement un modèle à l'intérieur du chargeur en fonction du type de délégué. – user1540436

+0

Euh, hein? Je ne comprends pas ce que vous essayez de faire. En outre, vous ne devriez pas avoir d'erreurs avec le code dans cette réponse. – Mitch