Wpis z mikrobloga

Szukam i szukam i odpowiedzi nie mogę znaleźć. Zabrałem się dzisiaj za qt quick i już na starcie pojawił się problem. Ustawiłem sobie ContextProperty na swój "viewModel", gdzie mam QList. Pakuje do niej powiedźmy obiekty klasy Person, jak zbindować tą listę z ComboBoxem, żeby wyświetlaną wartością było pole Name. Z góry dziękuje.
#cpp #qt #qt5 #qml #naukaprogramowania
  • 18
@GaHee:
Ustawiasz textRole na property która jest koniecznie QString(albo coś co zmienia się do jsowego stringa):

ComboBox {
        textRole:"myProperty"
        
model: myArray
    }

Generalnie na viewModel trzeba uważać bo każdy rodzaj obiektu działa inaczej. Najbardziej odpowiednie i najtrudniej jest zrobić własny model w C++ dziedzicząc po QAbstractListModel. Generalnie jak przekażesz tablicę to większość obiektów jako model przyjmie to w pewien wrapper który wystawia tylko jedną zmienną modelData do którego
@lionbest: Pamiętaj że w klasie którą wrzucasz do listy musisz mieć to property w pełnie zadeklarowane:

Q_PROPERTY(QString myProperty READ myProperty WRITE setMyProperty NOTIFY myPropertyChanged)
Chyba że ta wartość zawsze będzie stała (od powstawia obiektu) i deklarowanie sygnału NOTIFY jest bezensu wtedy deklarujesz tak:

Q_PROPERTY(QString myProperty READ myProperty CONSTANT )
Inaczej QML się burzy że nie ma sygnału NOTIFY.
@GaHee:

ComboBox {
   textRole:"name"
   model: datacontext.hotels
}
Coś takiego?
Jak tworzysz tą ViewModel ? w main.cpp jako
engine.rootContext()->setContextProperty("datacontext",QVariant::fromValue(viewModel)); ?

Pamiętaj imporcie:

import QtQuick.Controls 2.0
@lionbest: Jezuuuu, ja cię przepraszam, że Ci głowę zawróciłem. Wczoraj, po prostu musiałem być tak strasznie rozkojarzony(pewnie przez to, że nie potrzebnie się zdenerwowałem na qt). W konstruktorze nie dodawałem obiektów do listy. :D
@lionbest: Póki co ciężko mi jest się przystosować. Ale nie robię nic wielkiego(taki prościutki program do bookowania hoteli). Wczoraj się zdziwiłem, że w qml nie ma QEditDate(taki popupowy kalendarz), a Calendar jest w `QtQuick.Controls 1.4' a zaimportowanie tego niweluje działanie themu material design. :/
@lionbest: Ja poszedłem strasznie na skróty i zrobiłem combobox z datami. :D Tylko jeszcze zrobię, żeby ten combobox był searchable(wpisujesz coś i wyszukuje w comboboxie). Nie wiem czy coś takiego jest tutaj możliwe, ale podobne rzeczy w wpf'ie robiłem. Polecasz jakieś inne materiały niż dokumentacje?
@GaHee: Chyba to zbyt młode i nieużywane jest by powstawały fajne artykuły na ten temat inne niż oficjalne webinary. Niestety nie rejestrowałem się tam i nie wiem czy warto.
@GaHee: To zależy. Jak coś jest singletonem i zawsze ma być istancjowane to rootContext()->setContextProperty jest ok. Gdy ten singleton nie koniecznie musi być zainicjowane to lepiej użyć rejestracji typu jako Singletona.
Jeżeli obiekt dostaje się do zewnętrznych danych ale dostęp ma pewien stan to lepiej mimo wszystko warto zarejestrować normalny typ i zainicjalizować w QML.
Jeżeli coś jest lokalnym stanem to zazwyczaj lepiej inicjalizować to w QML.
Aha typ tak czy
@GaHee: Nom ale generalnie to się zwraca bo skuteczne połączenie C++ i QML daje siłę. Ostatnio spiąłem google protobufa do QML poprzez refleksje. QMLowe property aliasy teraz robią robotę scalając API z widokiem.
@lionbest: Jak już zacząłem zabawę z tymi propery i datacontextem to mi dość mocno przypomina wpfowy model-viewModel-view. Szczerze powiedziawszy, jestem newbe, więc musiałem rozszyfrować co napisałeś. :D
@GaHee: Tak to mocno idzie w strone MVVM ale daje ci możliwość uproszczeń i pisania wszystkiego w QML, a tak naprawdę to najlepiej główny QML traktować jako kontroler, a korzystać z plików .ui.qml które od Qt5.8 są traktowane jako widoki.