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!

Author: Pablote, 2014-04-05

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 do ListView)

(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"
}
 13
Author: leemes,
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"]

 3
Author: Ngọc Tân Đỗ,
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 lub Item) - nie używaj formularza nagłówka ListView.To sprawia, że stała dla dowolnej ilości danych.
  • Wrap ListView to ScrollView (jeśli potrzebujesz scrollbarów)
  • użycie Clip: true property in list for make correct
  • Ustaw styl dla highlight I set highlightFollowsCurrentItem:true W ListView

Jako bonus w przyszłości może być użyty do tworzenia " TreeTable" :)

 1
Author: ShaKeSPeaR,
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