2017-03-10 4 views
0

Ich versuche, eine QML-ListView mit einer Klasse zu füllen, die QAbstractListModel erbt. Bisher konnte ich dies mit der QT-Dokumentation erstellen here, unter dem "QAbstractItemModel Unterklasse" Abschnitt:Zugriff auf verschachtelte ListView mit QQmlContext

main.cpp

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 

#include <QQmlContext> 
#include "gamemodel.h" 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 

    GameModel model; //A class similar to AnimalModel in Qt Documentation. 
         //It contains a QList of Objects, each having 2 QString 
         //members (title and genre). 

    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    model.readFile("c:/somePath/XML_G.xml"); //Initializing GameModel QList member 
              //using an XML file 

    QQmlContext *ctxt = engine.rootContext(); 
    ctxt->setContextProperty("myModel", &model); 

    return app.exec(); 
} 

main.qml

import QtQuick 2.5 
import QtQuick.Window 2.2 

Window 
{ 
    id: win 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 


    ListView 
    { 
     id: myList 
     width: parent.width 
     height: 50 

     clip: true 
     spacing: 5 
     orientation: ListView.Horizontal 
     model: myModel 
     delegate: 
     Rectangle 
     { 
      width: 150 
      height: 20 
      color: "#2255ff" 

      Text 
      { 
       text: gameTitle + " " + genre 
      } 

     } 
    } 

} 

Bis zu diesem Punkt funktioniert mein Code. wenn ich versuche, jedoch meine main.qml Datei wie folgt zu ändern:

import QtQuick 2.5 
import QtQuick.Window 2.2 

Window 
{ 
    id: win 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    Item //ListView is now nested in this Item 
    { 

     ListView 
     { 
      id: myList 
      width: parent.width 
      height: 50 

      clip: true 
      spacing: 5 
      orientation: ListView.Horizontal 
      model: myModel 
      delegate: 
      Rectangle 
      { 
       width: 150 
       height: 20 
       color: "#2255ff" 

       Text 
       { 
        text: gameTitle + " " + genre 
       } 

      } 
     } 
    } 

} 

ich nicht in der Lage am Ende zu meinem Modell mit ctxt-> setContextProperty ("MyModel", & Modell) gesetzt;. Von dem, was ich aus der Qt-Dokumentation entnehmen kann (obwohl ich höchstwahrscheinlich falsch bin), fungiert QQmlContext als ein Bereich für die QML-Datei. Zu denken, dass habe ich versucht, dies zu ändern:

QQmlContext *ctxt = engine.rootContext(); 

dazu:

QQmlContext *ctxt = engine.rootContext()->findChild<QQmlContext*>("list"); 

Neben Einstellung meiner Artikel ObjektName Eigenschaft auf "Liste". Offensichtlich ist das gescheitert, und es hat auch einen Unfall verursacht. Da meine Erfahrung mit QML auf die Qt Docs beschränkt ist, konnte ich keinen Workaround finden. Ist eine Lösung mit QQmlContext möglich, oder muss ich QObject verwenden? Wenn ja, was würde das QObject-Äquivalent von ctxt-> setContextProperty ("myModel", & Modell) sein?

+1

Versuchen Sie QQmlContext * ctxt = engine.rootContext(); ctxt-> setContextProperty ("meinModell", & -Modell); vor engine.load(). ZB direkt nachdem Sie Ihr Modell definiert haben, bevor Sie die Ansicht laden. – arynaq

+0

Mein Code oben funktioniert normal. Ich möchte auf ein ListView zugreifen, das in einem anderen Item verschachtelt ist, wo ich gerade feststecke. – SASUPERNOVA

Antwort

0

Das erste Argument des Aufrufs setContextProperty() ist im Grunde der "Bezeichner" des Objekts, wie die Eigenschaft id auf der QML-Seite.

Sie müssen dies vor dem Zugriff in QML festlegen, andernfalls ist es zum Zeitpunkt der Verwendung unbekannt.

Sie brauchen also keinen anderen Anruf, aber Sie müssen es tun, bevor Sie QML laden, die es benötigt.

bewegen Sie sie einfach vor der engine.load(...) Zeile in Ihrer main.cpp

+0

Was Sie sagen, ist in der Tat wahr. Wenn ich mein Programm starte, erhalte ich die Meldung, dass myModell nicht definiert ist.Dies geschieht jedoch nur in der QML-Datei. Sobald mein C++ Code ausgeführt wird, läuft das Programm normal weiter und die Liste wird wie erwartet angezeigt. Ich habe meine 'engine.load' vor dem Aufruf von' setContextProperty() 'mit Absicht verschoben, um zu sehen, wie lange es dauert, bis mein XML geladen ist. Mein Problem liegt jedoch nicht darin, dass mein Code im Allgemeinen nicht funktioniert, sondern darin, dass 'setContextProperty()' eine ListView findet, die in einem anderen Item verschachtelt ist (d. H. Eine ListView, die nicht auf der Stammebene liegt). – SASUPERNOVA

0

OK, offenbar in meiner QML-Datei mein Problem war. In meinem Code, ich Setup meine Listview wie folgt aus:

width: parent.width

Allerdings, wenn ich einen Artikel als Mutter meiner Listview hinzugefügt, habe ich vergessen, eine anfängliche Breite für meine Artikel zu setzen, so Listview Breite drehen zu 0. Nachdem ich eine anfängliche Breite für meinen Artikel festgelegt habe, funktioniert alles wieder wie erwartet.

Verwandte Themen