2016-05-12 10 views
1

Ich habe Probleme beim Laden dynamischer Delegaten mit dynamischen Modellen mit den Loadern. Ich kann den Delegaten des entsprechenden Modells sehen, aber die Daten in diesem Delegaten werden nicht angezeigt. Wenn Sie auf den Button, um den Fehler wie immer "Reference:‚: Name ist nicht definiert‘ ich unten die komplette Beispiel gepostet Könnte jemand vorschlagen, wenn ich irgend etwas fehleDaten werden nicht für dynamische Delegaten mit dynamischen Modellen in QML abgerufen

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

Hallo Mitch, Ja Ich bekomme den gleichen Fehler. Wie man diesen Fehler auflöst. weil ich in der Lage bin, die delegierte Komponente zu sehen. – user1540436

+0

Mein vollständiges Modell und delegiere nur in einer einzelnen qml-Datei. Ich habe nicht viel in C++. Sie finden den C++ - Code unten. #include #include int main (int argc, char * argv []) { QGuiApplication app (argc, argv); QQmlApplicationEngine Engine; engine.load (QUrl (QStringLiteral ("qrc: /main.qml"))); Rückgabe app.exec(); } – user1540436

+0

Mein schlechtes. Ich habe meine Kommentare gelöscht. – Mitch

Antwort

0

Ich denke, dass.. a. Loader Verwendung während einer delegate ist keine gute Idee Einstellung Versuchen Sie, diese:

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 

      } 

     } 
    } 
} 

Um dies:

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

I Wenn Ihnen das nicht hilft, bearbeiten Sie Ihre Antwort und fügen Sie den vollständigen Beispielcode bei. Das Beispiel, das Sie angegeben haben, enthält Fehler und ich weiß nicht, welche von ihnen wegen eines zu kurzen Beispiels auftreten und welche tatsächlich Fehler sind.

+1

@Hazubski: Ich habe den vollständigen Beispielcode oben gepostet. Mein Szenario im obigen Beispiel ist ich habe eine Listenansicht mit Standardmodell und Delegate, wenn ich auf die Schaltfläche (Schaltfläche 1/Schaltfläche 2/Schaltfläche 3) klicke, dann hat es unterschiedliche Modell und Delegate, hängt von der Schaltfläche Modell und delegieren muss Wählen Sie entsprechend aus. Wenn ich versuchte, manuell als onClicked zuweisen: { – user1540436

+0

Wenn ich manuell als onClicked zuweisen versucht: {listView.model = button1Model loader.sourceComponent = b1Delegate } I qrc eine RefereError der vorherigen Tasten bin immer:/main .qml: 200: ReferenceError: Name ist nicht definiert qrc: /main.qml: 210: ReferenceError: Marks ist nicht definiert – user1540436

0

Die Daten aus dem Modell müssen für den Bereich des Stellvertreters sichtbar gemacht werden. Sie können in ein similar way as Qt Quick Controls does it tun:

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 
     } 
    } 
} 

Dann listDelegate würde:

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 
      } 
     } 
    } 
} 

Hier ist der richtige Code (ich einige davon vereinfacht):

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

Vielen Dank für die Hilfe, können Sie bitte vorschlagen, wenn ich das Modell verwenden muss anstatt alle zuweisen Variablen getrennt wie kann ich es tun. – user1540436

+0

Vielen Dank für die Hilfe, können Sie bitte vorschlagen, wenn ich das Modell verwenden muss anstatt alle Variablen separat zuzuweisen, wie kann ich es tun. Ich meine, innerhalb des Loader zu sagen, meine Anforderung ist wie ich werde nur einige Variablen abhängig von der Delegate Typ verwenden, jetzt, da ich alle Variablen in Loader wieder erkläre ich bekomme das gleiche Problem wie früher, aber für weniger Variablen . Bitte geben Sie an, wie wir ein Modell innerhalb des Loaders abhängig vom Delegattyp direkt zuweisen können. – user1540436

+0

Äh, nicht wahr? Ich verstehe nicht, was du zu tun versuchst. Außerdem sollten Sie keine Fehler mit dem Code in dieser Antwort erhalten. – Mitch