2016-06-01 9 views
1

Ich möchte horizontale Listenansicht als Delegate von vertikalen Listview machen. Ist es möglich, verschiedene Modelle an horizontale Listenansichten von C++ anzuhängen?Modell der horizontalen Listenansicht in der vertikalen Listenansicht

ListView { 
      id: eventList 
      model: N (N tells how many horizontal lists are there) 
      delegate: 
       ListView { 
       id: horizontall 
       model: ?? // How to attach different model from C++ to each horizontal list 
       orientation: ListView.Horizontal 

in C++ Teil I N eingebaut wurden Anzahl der QList Liste haben, die

Antwort

0

Ja, es ist möglich von QAbstractlistmodel abgeleitet werden. Es ist einfach nicht möglich, einen ListModel mit einem anderen ListModel zu erstellen. Zumindest ist es in QML nicht möglich.

Hier ist schnell und schmutzig Beispiel, wie man es macht. Löst es dein Problem?

import QtQuick 2.4 
import QtQuick.Controls 1.4 
import QtQuick.Layouts 1.1 
import QtQuick.Controls.Styles 1.4 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width: 640 
    height: 480 

    ListModel { 
     id: listModel 
     ListElement {slmIndex: 0} 
     ListElement {slmIndex: 1} 
     ListElement {slmIndex: 2} 
     ListElement {slmIndex: 3} 
     ListElement {slmIndex: 4} 
     ListElement {slmIndex: 5} 
    } 

    ListModel { 
     id: model1 
     ListElement { name: "1" } 
    } 
    ListModel { 
     id: model2 
     ListElement { name: "1" } 
     ListElement { name: "2" } 
    } 
    ListModel { 
     id: model3 
     ListElement { name: "1" } 
     ListElement { name: "2" } 
     ListElement { name: "3" } 
    } 
    ListModel { 
     id: model4 
     ListElement { name: "1" } 
     ListElement { name: "2" } 
     ListElement { name: "3" } 
     ListElement { name: "4" } 
    } 
    ListModel { 
     id: model5 
     ListElement { name: "1" } 
     ListElement { name: "2" } 
     ListElement { name: "3" } 
     ListElement { name: "4" } 
     ListElement { name: "5" } 
    } 
    ListModel { 
     id: model6 
     ListElement { name: "1" } 
     ListElement { name: "2" } 
     ListElement { name: "3" } 
     ListElement { name: "4" } 
     ListElement { name: "5" } 
     ListElement { name: "6" } 
    } 
    property var secondLayerModels: [ 
     model1, model2, model3, model4, model5, model6 
    ] 

    ListView { 
     anchors.centerIn: parent 
     width: 200 
     height: 200 
     clip: true 
     model: listModel 
     orientation: ListView.Vertical 
     delegate: ListView { 
      width: 200 
      height: 50 
      model: secondLayerModels[slmIndex] 
      orientation: ListView.Horizontal 
      delegate: Rectangle { 
       width: 50 
       height: 50 
       border.color: "black" 
       Text { 
        anchors.fill: parent 
        verticalAlignment: Text.AlignVCenter 
        horizontalAlignment: Text.AlignHCenter 
        text: name 
       } 
      } 
     } 
    } 
} 

Ich bin nicht sicher, ob diese Antwort vollständig die Frage abdeckt. Es behandelt nicht, wie ein C++ - Modell erstellt wird, das weitere Modelle verfügbar macht.

+1

Das Verschachteln von 'ListModels' ist möglich über' attributes', siehe [hier] (http://stackoverflow.com/a/34358794/2538363) und verwandte Links. Das heißt, es scheint mir, dass das Verschachteln von Modellen eine unnötige Addition von Komplexität ist. Ich würde die C++ - Modelle registrieren und sie dann in einer benutzerdefinierten Ansicht mit 'Flickable' +' Repeater' verwenden. In einer dynamischeren Einstellung, z.B. Wenn sich die C++ - Modelle drastisch ändern können, wäre es gut, eine eindeutige Klasse zu haben, die die Anzahl der Modelle aufdeckt und ihnen Zugriff gewährt. Nur meine zwei Cent. – BaCaRoZzo

+0

@Filip Hallo, das Problem ist, dass ich nicht weiß, wie viele Modelle ich haben werde - das hängt von einigen Daten in C++ ab. Ich weiß, dass es möglich ist, ListElement zu ListModel hinzuzufügen, aber ich kann keine geeignete Methode zum Erstellen von N ListModels finden und dann Elemente zu jedem Modell hinzufügen. Im Beispiel haben Sie 6 Modelle mit der Eigenschaft var secondLayerModels fest codiert. ## BaCaRoZzo: Ich habe versucht, mit Listview innerhalb Repeater und es funktioniert auch gut mit Array von Modellen und jedes Modell wegen Index zu bekommen. Weißt du etwas über das, was ich Filip gefragt habe? Es scheint ein einfaches Problem zu sein, aber ich kann die Lösung nicht erreichen. – iTwo