2014-10-12 25 views
6

Mam kilka modeli, które używają reguł QAbstractItemModel do pobierania i dostarczania danych dla tabeli.Używanie istniejącego (wiersz, kolumnę) modelu C++ z QtQuick (siatka, TableView)

Mój przykładowy model ma wiele kolumn i wierszy. Niestety widgety QtQuick mogą obsługiwać tylko jedną kolumnę. Inne "kolumny" są dodawane do widżetów QtQuick za pomocą ról. Tak wiele kolumn w widoku jest zgodnych z tą samą kolumną w modelu. Inne kolumny modelowe są ignorowane, jak wyjaśniono w this question and its answer

Myślałam, że nie powinno być zbyt trudne, aby zapewnić abstrakcji dla QML mają być wykorzystywane w C++ stronie (jako QAbstractProxyModel), który pytany o rzędzie N, modulos przez liczbę kolumn modelu źródłowego i pobiera dane z wynikowej kolumny rzeczywistej. Wygląda na to, że działa on pod numerem Grid, ale nie zadziała dla TableView, ponieważ opiera się na TableViewColumn i nazwach ról, zamiast używać tylko ciągłych indeksów wierszy. W tym celu model proxy musiałby rozróżniać rolę, z której kolumny modelu źródłowego można pobrać.

Fragment znajdujący się w odpowiedzi na http://qt-project.org/forums/viewthread/41793 robi to dla przyjęcia QSqlTableModel, ale nadal brakuje tłumienia wielu sygnałów, aby były użyteczne. Tak jak wyobrażam sobie, że model źródłowy SQL emitowałby columnsInserted, powinien przetłumaczyć na sygnał dataChanged z nowymi rolami wybranymi dla tej kolumny i zmianą dostępnych nazw ról. Wydaje się, że QMLifyProxyModel jest lepszy, ale nie jest gotowy do produkcji i nie żyje od 4 lat.

Jak najlepiej to naprawić, aby dwa światy działały razem płynnie, zgodnie z oficjalną rekomendacją? Dlaczego w widokach QtQuick nie jest używana notacja (wiersz, kolumna), której używa już QAbstractItemModel i QTableView?

Odpowiedz

1

Część trudności polega na tym, że sposób, w jaki QtQuick używa modeli, jest bardziej rygorystyczny niż widoki QWidget, więc warto spróbować osiągnąć to na odwrót; przekształcanie modeli w role i używanie modelu proxy do odwzorowywania ról na indeksy kolumn + headerData w taki sam sposób jak TableViewColumn, ale w przypadku widoków QWidget. Sygnały wstawiania i usuwania kolumn powinny być łatwiejsze w obsłudze, jeśli źródłem jest statyczna liczba ról, a nie zmieniająca się liczba kolumn.

Niestety nie pomoże to w przypadku wbudowanych lub bardziej złożonych modeli.

Większość widoków QtQuick została zaprojektowana dla modeli 1D, gdy celem projektu były telefony. Role zostały użyte do mapowania nieuporządkowanych właściwości jednego wiersza/elementu do ich nazw skryptów.

TableView pojawił się kilka lat później i wydaje się być tym, który powinien był zrobić jeszcze więcej, aby pozwolić na używanie modeli 2D, ale prawdopodobnie byłby to dość dodatkowa praca w czasie, gdy QtQuick był już całkiem bestią, zwłaszcza, że ​​TableView został napisany głównie w samym QML.