2012-12-25 17 views
5

Dzisiaj chciałem trochę zagrać z QtQuick2. Tak więc zacząłem przenosić bardzo prostą aplikację Qt Quick1 do Quick2. Ta aplikacja używa niektórych modeli. A w Qt5 modele nie działają tak jak oczekuję: nie mogę uzyskać dostępu do danych za pomocą ról.Modele i role w Qt5 i Qt 4.8

To jest mój kod QML:

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

W Qt4.8 I był w stanie uzyskać dane za pomocą roleName składni (w tym QML mój RoleName = homm), ale w Qt5 nie mogę. To, co jest napisane w konsoli:

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

I to do szybkiego 1,1

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

Jak widać dostępu do danych za pomocą ról działa zgodnie z oczekiwaniami. Stworzyłem dla Ciebie aplikacje testowe: for Qt5 i for Qt 4.8. Mam nadzieję, że pomożesz mi znaleźć serce materii.

P.S. Wprowadziłem pewne zmiany w wersji Qt5. W Qt5 metoda setRoleNames() jest przestarzała i zaleca się nadpisanie wartości roleNames(). Zrobiłem to przeważając.

P.P.S. Przykład mojego kodu powinien być kompilowany na GNU/Linux x64

+0

Twój kod Qt5 nie jest kompilowany. –

+0

trollixx, Jeśli mówisz o ''MiniModel': inicjalizacja nielegalnego członka' Nie wiedział tego. Zostałem przetestowany na systemie GNU/Linux x64. Potrzebuję trochę czasu, aby zbadać, co jest nie tak w kompilatorze MSVC. – Kakadu

+0

Ubuntu Linux x86_64, g ++ 4.6.3. –

Odpowiedz

3

Znalazłem błąd w kodzie. roleNames() jest metodą ciągłą. Oto działająca linia kodu:

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

Istnieje również działający przykład: examples/quick/modelviews/abstractitemmodel.