Krótka odpowiedź
MVC Qt ma zastosowanie tylko do jednej struktury danych . Mówiąc o aplikacji MVC , nie powinieneś myśleć o QAbstractItemModel
lub QListView
.
Jeśli chcesz mieć architekturę MVC dla całego programu, Qt nie ma tak „ogromnego” szkieletu modelu / widoku. Ale dla każdej listy / drzewa danych w twoim programie możesz użyć podejścia Qt MVC, które rzeczywiście ma kontroler w swoim widoku. Danych jest wewnątrz lub na zewnątrz wzór; zależy to od typu używanego modelu (własna podklasa modelu: prawdopodobnie w modelu; np. QSqlTableModel: na zewnątrz (ale może być zapisany w pamięci podręcznej) modelu). Aby połączyć modele i widoki, użyj własnych klas, które następnie implementują logikę biznesową .
Długa odpowiedź
Model / widok Qt i terminologia:
Qt zapewnia proste widoki dla swoich modeli. Mają wbudowany kontroler : wybieranie, edytowanie i przenoszenie elementów jest czymś, czym w większości przypadków kontroler „steruje”. Oznacza to, że interpretujemy dane wejściowe użytkownika (kliknięcia myszą i ruchy) i wydaje odpowiednie polecenia modelowi.
Modele Qt są rzeczywiście modelami zawierającymi podstawowe dane. Abstrakcyjne modele oczywiście nie przechowują danych, ponieważ Qt nie wie, jak chcesz je przechowywać. Ale ty rozszerzyć QAbstractItemModel do swoich potrzeb, dodając swoje kontenery danych do podklasy i uczynienie interfejsu modelu z dostępem do danych. Tak więc, i zakładam, że ci się to nie podoba, problem polega na tym, że musisz zaprogramować model, czyli w jaki sposób uzyskuje się dostęp do danych i modyfikuje je w strukturze danych.
W terminologii MVC model zawiera zarówno dane, jak i logikę . W Qt to od Ciebie zależy, czy włączysz część logiki biznesowej do swojego modelu, czy też umieścisz ją na zewnątrz, będąc „widokiem” samym w sobie. Nie jest nawet jasne, co oznacza logika: wybieranie, zmienianie nazwy i przenoszenie elementów? => już zaimplementowane. Robisz z nimi obliczenia? => Umieść go na zewnątrz lub wewnątrz podklasy modelu. Przechowywanie lub ładowanie danych z / do pliku? => Umieść go w podklasie modelu.
Moja osobista opinia:
Bardzo trudno jest zapewnić programiście dobry i ogólny system MV (C). Ponieważ w większości przypadków modele są proste (np. Tylko listy ciągów znaków), Qt dostarcza również gotowy do użycia QStringListModel. Ale jeśli twoje dane są bardziej złożone niż ciągi, to od Ciebie zależy, jak chcesz przedstawić dane za pomocą interfejsu modelu / widoku Qt. Jeśli masz na przykład strukturę z 3 polami (powiedzmy osoby z imieniem, wiekiem i płcią), możesz przypisać te 3 pola do 3 różnych kolumn lub 3 różnych ról. Nie lubię obu podejść.
Myślę, że struktura modelu / widoku Qt jest przydatna tylko wtedy, gdy chcesz wyświetlić proste struktury danych . Trudno jest sobie z tym poradzić, jeśli dane są niestandardowego typu lub nie są uporządkowane w drzewie lub na liście (np. Wykres). W większości przypadków wystarczą listy, a nawet w niektórych przypadkach model powinien zawierać tylko jeden wpis. Szczególnie jeśli chcesz modelować jeden pojedynczy wpis mający różne atrybuty (jedno wystąpienie jednej klasy), struktura modelu / widoku Qt nie jest właściwym sposobem oddzielenia logiki od interfejsu użytkownika.
Podsumowując, myślę, że struktura modelu / widoku Qt jest przydatna wtedy i tylko wtedy, gdy dane są przeglądane przez jeden z widżetów przeglądarki Qt . Jest to całkowicie bezużyteczne, jeśli masz zamiar napisać własną przeglądarkę dla modelu zawierającego tylko jeden wpis, np. Ustawienia aplikacji, lub jeśli twoje dane nie są typu do druku.
Jak korzystałem z modelu / widoku Qt w (większej) aplikacji?
Kiedyś napisałem (w zespole) aplikację, która wykorzystuje wiele modeli Qt do zarządzania danymi. Zdecydowaliśmy się utworzyć plik DataRole
do przechowywania rzeczywistych danych, które były innego typu niestandardowego dla każdej innej podklasy modelu. Stworzyliśmy zewnętrzną klasę modelu o nazwie Model
przechowująca wszystkie różne modele Qt. Stworzyliśmy również zewnętrzną klasę widoku zwaną View
trzymającą okna (widżety), które są połączone z modelami wewnątrz Model
. Więc to podejście jest rozszerzonym Qt MVC, dostosowanym do naszych własnych potrzeb. Obie klasy Model
i View
same klasy nie mają nic wspólnego z Qt MVC.
Gdzie umieściliśmy logikę ? Stworzyliśmy klasy, które wykonywały rzeczywiste obliczenia na danych, odczytując dane z modeli źródłowych (gdy uległy zmianie) i zapisując wyniki w modelach docelowych. Z punktu widzenia Qt, te klasy logiki byłyby widokami, ponieważ „łączą się” z modelami (nie „widok” dla użytkownika, ale „widok” dla logiki biznesowej części aplikacji).
Gdzie są kontrolerzy ? W oryginalnej terminologii MVC kontrolery interpretują dane wejściowe użytkownika (mysz i klawiatura) i wydają modelowi polecenia, aby wykonać żądaną akcję. Ponieważ widoki Qt już interpretują dane wejściowe użytkownika, takie jak zmiana nazwy i przenoszenie elementów, nie było to potrzebne. Potrzebowaliśmy jednak interpretacji interakcji użytkownika, która wykracza poza widoki Qt.