2012-12-25 5 views
5

Heute wollte ich mit QtQuick2 ein wenig spielen. Also habe ich begonnen, sehr einfache Qt Quick1 App zu Quick2 zu portieren. Diese App verwendet einige Modelle. Und in Qt5 funktionieren die Modelle nicht wie erwartet: Ich kann nicht über Rollen auf Daten zugreifen.Models und Rollen in Qt5 und Qt 4.8

Das ist mein QML-Code:

import QtQuick 2.0 

Rectangle { 
width: 800 
height: 360 

ListView { 
    model: mainModel 
    spacing: 5 
    anchors.fill: parent 
    orientation: ListView.Vertical 
    delegate: Text { 
     text: "1" 

     Component.onCompleted: { 
      console.log(mainModel); 
      console.log(mainModel.roles()); 
      console.log(model); 
      console.log(model.homm); // `homm` is my roleName 
      console.log(homm); 
     } 
    } 

In Qt4.8 konnte ich Daten erhalten, mit roleName Syntax (in diesem QML meines rolename = homm), aber in QT5 kann ich nicht. Das ist, was in der Konsole geschrieben:

MainModel(0x7fff08beff80) 
homm,wtf 
QQuickVDMAbstractItemModelData(0x23c96e0) 
undefined 
file:///media/disk/kakadu/prog/qt/quick2test/qml/quick2test/main.qml:20: ReferenceError: homm is not defined 

Und das ist für Quick 1,1

MainModel(0x7fffe58182f0) 
undefined 
QDeclarativeVisualDataModelData(0x2372ea0) 
QVariant(MiniModel*) 
QVariant(MiniModel*) 

Wie Sie alle Details einsehen können den Zugriff auf mit Rollen wie erwartet. Ich habe Test-Apps für Sie erstellt: for Qt5 und for Qt 4.8. Ich hoffe, du wirst mir helfen, das Herz der Materie zu finden.

P.S. Ich habe einige Änderungen in der Qt5-Version vorgenommen. In Qt5 ist die Methode setRoleNames() veraltet und das Überschreiben von roleNames() wird empfohlen. Ich habe dies übertrieben.

P.P.S. Mein Codebeispiel sollte unter GNU/Linux x64 kompiliert werden.

+0

Ihr Qt5-Code wird nicht kompiliert. –

+0

trollixx, Wenn du über ''MiniModel' sprichst: illegale Member-Initialisierung 'Das wusste er nicht. Ich wurde auf GNU/Linux x64 getestet. Ich brauche etwas Zeit, um zu untersuchen, was im MSVC-Compiler falsch ist. – Kakadu

+0

Ubuntu Linux x86_64, g ++ 4.6.3. –

Antwort

3

Ich habe einen Fehler in Ihrem Code gefunden. roleNames() ist eine konstante Methode. Hier ist eine Arbeitscodezeile:

virtual QHash<int, QByteArray> roleNames() const { return _roles; } 

Es ist ein funktionierendes Beispiel zu: Beispiele/quick/modelviews/abstractitemmodel.