2014-02-10 7 views
5

Qt Dokumentation scheint ein bisschen kurz in Bezug auf das Problem, aber ich versuche, QLists als Modelle für eine ListView zu verwenden. Die Sache ist, ich repräsentiere eine Hierarchie und jedes Mal, wenn ein Element angeklickt wird, wird das Modell mit einem anderen ausgetauscht, das QML von einem C++ - Callback erhält.QML ListView mit QList <QObject*> als Modell

Dies ist das Objekt ein Listenelement darstellt:

class MyObject : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString   name  READ getName WRITE setName) 
    Q_PROPERTY(QString   subtitle READ getSubtitle) 
    Q_PROPERTY(QList<QObject*> descent READ getChildren NOTIFY childrenUpdated) 
    ... 
} 

Und wie ich es in QML verwenden:

ListView { 
    id: list_view 
    model: myModel 
    anchors.fill: parent 
    delegate: Item { 
    id: row 
    height: 50 
    anchors.left: parent.left 
    anchors.right: parent.right 

    MouseArea { 
     anchors.fill: row 
     onClicked: { 
     list_view.model = descent; 
     } 
    } 

    Column { 
     Text { text: name } 
     Text { text: subtitle } 
    } 
    } 
} 

Die "MyModel" -Modell in der Hauptsache, wie dies festgelegt ist:

context->setContextProperty("myModel", QVariant::fromValue(folder.getChildren())); 

Das erste Mal, dass ListView angezeigt wird, verwendet es myModel als Modell, und es funktioniert. Immer wenn ich auf ein Element klicke, erstellt das ListView jedoch die genaue Anzahl der erwarteten Elemente ... aber es kann keine seiner Eigenschaften lesen!

Wie kommt es, dass ListView genau weiß, wie viele Elemente es erstellen muss, aber seine Eigenschaften nicht sehen kann?

Antwort

5

Ich glaube, das ist das richtige Verhalten, das Sie beobachten. QML kennt die Anzahl der Elemente in der QList aber soweit sie für name und subtitle Abfragen, die nicht möglich ist, weil descent entspricht nicht den Zwängen der ListView::model

Von der QML-Dokumentation für die ListView::model property:

Das Modell stellt die Datenmenge bereit, die zum Erstellen der Elemente in der Ansicht verwendet wird. Modelle können mithilfe von ListModel, XmlListModel oder VisualItemModel direkt in QML erstellt oder von C++ - Modellklassen bereitgestellt werden. Wenn eine C++ - Modellklasse verwendet wird, muss es eine Unterklasse von QAbstractItemModel oder eine einfache Liste sein.

Also in dieser Hinsicht, werden Sie entweder descent ändern, um eine einfache Liste zu sein, die ich Mittel, die einfache Daten wie ein einzelner glauben QString, int, etc ... oder sie implementieren als QAbstractItemModel, die enthält Ihre Liste von QObjects.

+0

Ich habe von dem QAbstractItemModel gehört und wollte das nicht tun: Da ich mit einfachen Daten arbeite (nur QString), werde ich in 'anständig' schauen! Vielen Dank! – Michael

Verwandte Themen