Właściwości modelu dostępu QML TableView z delegata
Mam TableView dla którego zdefiniowałem swój własny itemDelegate. Teraz z tego delegata mogę uzyskać dostęp do wartości kolumny za pomocą styleData.wartość, ale musiałbym również uzyskać dostęp do innych właściwości w tym samym elemencie, ale nie mogę znaleźć, jak to zrobić.
Potrzebuję tego, ponieważ stylizacja tekstu musi się zmienić w zależności od innej właściwości modelu elementu.
Jakieś pomysły? dzięki!
3 answers
Brakuje pewnej dokumentacji. W obrębie elementu delegat możesz uzyskać dostęp do następującego (zaczerpniętego z kodu źródłowegoTreeView.qml
):
-
styleData
(zobacz dokumentację ) -
model
(obecnie nie udokumentowane) -
modelData
(obecnie nie udokumentowane, nie jestem tego pewien, ale myślę, że jest to podobne doListView
)
(nawiasem mówiąc, to, czego brakuje również w dokumentacji, ale co jest przydatne, to styleData.role
. Ponadto dokumentacja innym delegatom brakuje też pewnych dostępnych właściwości; najlepiej zajrzeć do kodu źródłowego pliku QML i poszukać elementu Loader, który tworzy instancję twojego delegata. Na plus uczysz się, jak to działa. ;))
Z model
i informacjami o wierszu/kolumnie można następnie przejść do danych pozycji. Kod ten zależy od typu modelu.
Jeśli używasz QML ' s ListModel
, możesz użyć model.get
: model.get(styleData.row)[styleData.role]
powinny wtedy działać (niesprawdzone, ponieważ I używaj go rzadko, proszę o opinie).
Jeśli używasz C++ QAbstractItemModel lub friends, najlepiej jest dodać slot do klasy modelu, który przyjmuje tylko nazwę wiersza i roli, ponieważ to informacje, z którymi działa TableView
(ani z numerami ról, ani z kolumnami...).
Jednakże w obu przypadkach nie powinieneś używać wyrażenia w powiązaniu właściwości! System powiadomień nie będzie działał, ponieważ nie używasz systemu właściwości do uzyskiwania dostępu do danych. Zgodnie z twoim pytaniem, chyba chciałeś go użyć w wyrażeniu z oprawą. Nie wiem jak prawidłowo słuchać zmian w modelu ręcznie.
Alternatywnym podejściem jest dostęp do pozostałych elementów wiersza i zapewnienie tam właściwości. Kilka wskazówek:
-
Z jednego elementu można uzyskać dostęp do innych elementów tego samego wiersza, przechodząc drzewo obiektów dwa razy w górę (najpierw do programu ładującego, który tworzy instancję komponentu, potem do rzeczywistego wiersza), a następnie w dół dwa razy (najpierw do konkretnego obiektu potomnego, którym jest Loader, potem jego instancyjna pozycja). Musisz znać numer kolumny, do której chcesz uzyskać dostęp (Nie nazwę roli), zakładam, że chcesz uzyskać dostęp do pierwszej kolumny (indeks 0):
parent.parent.children[0].item
-
Możesz podać dane modelu, używając właściwości w każdej pozycji. Przy założeniu prostego elementu tekstowego może to być:
Text { property variant value: styleData.value // <-- Here you make it available // your other stuff }
Złożenie ich razem może wyglądać następująco. W tym przykładzie zakładam, że pierwszy wiersz zawiera liczba całkowita, a jeśli jest zero, Druga kolumna powinna być czerwona.
// (within TableView)
itemDelegate: Text {
property variant value: styleData.value
text: styleData.value
color: (styleData.column == 1 && parent.parent.children[0].item.value === 0)
"red" : "black"
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 23:28:26
Myślę, że jest to dość łatwe, jeśli odczytasz kod źródłowy TableViewItemDelegateLoader.qml (jest to kod prywatny w qtquickcontrol
)
Aby uzyskać dostęp do każdej roli, której używasz, użyj : model[your_role_name]
.
Exp: model["comment"]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 08:35:55
W obliczu tego samego problemu dzisiaj, jest to wynik moich badań (Qt 5.2.x)
Jeśli masz twardy limit TableView, jest tylko jedno poprawne rozwiązanie-użyj model.get(styleData.row)["roleForStyling"]
, jak napisał @leemes. Ale będzie to bardzo powolne, jeśli masz dużą ilość danych w modelu i używasz na przykład modelu proxy do sortowania / filtrowania.
Direct solution from @ leemes answer is great, but in general case not be working, because in TableView
any Item
wrapped in Loader
i dlatego niezależne od rodzica i innych elementów:
- Po utworzeniu jakiegoś elementu (gdzie chcesz zmienić styl tekstu) innym elementem (od którego można otrzymać tożsamość) nie może być created
- możesz nie mieć "rodzica" przy tworzeniu elementu (tj. być złamane)
W moim przypadku najlepszym rozwiązaniem dla deep customize było stworzenie prostego wrappera dla ListView
. W tym przypadku masz dostęp do pełnych danych wiersza w delegat bez narzutu. Highlights dla tworzenia komponentu ("mój własny ListView jako tabela"):
- Utwórz samodzielny nagłówek (
Rectangle
lubItem
) - nie używaj formularza nagłówkaListView
.To sprawia, że stała dla dowolnej ilości danych. - Wrap
ListView
toScrollView
(jeśli potrzebujesz scrollbarów) - użycie
Clip: true
property in list for make correct - Ustaw styl dla
highlight
I sethighlightFollowsCurrentItem:true
WListView
Jako bonus w przyszłości może być użyty do tworzenia " TreeTable" :)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-24 14:07:16