Organizacja klas w QT (Menadżer żużlowy).

0

Sprawa polega na tym, że załóżmy, że mam MainWindow gdzie powiedzmy sobie jest button StartMeczu. Teraz mam sobie klasy WidgetMecz, która rysuje okno dla meczu oraz Mecz, która zawiera dane Druzyny, Zawodnicy, Punktacja, Biegi itd. I teraz nie wiem jak sobie dobrze rozplanować projekt. Jeżeli mam ten button StartMeczu to gdzie definiować connect ? W klasie MainWindow tak? Gdzie definiować slot dla tego przycisku w klasie Mecz? Ona potem ma narysować WidgetMecz? Czy może także ma to wszystko być w MainWindow i rysowanie WidgetMecz także ?
Idźmy dalej na WidgetMecz mam przycisk Dalej, który powoduje symulację kolejnych biegów. Główna pętla przetwarzająca to powinna być w klasie Mecz. W takim razie jak klasa Mecz ma na WidgetMecz prezentować na bieżąco wyniki skoro WidgetMecz został narysowany przez MainWindow? Chodzi mi to o gdzie mają być utworzone instancje klas Mecz, WidgetMecz no i ten przycisk jak ma zostać zdefiniowany, gdzie connect, gdzie slot.

Bardzo proszę o pomoc, jakieś naprowadzenie na rozwiązanie bo już kilka dni nad tym rozmyślam i odchodzi mi powoli zapał na pisanie tego. Przeglądam różne tutoriale, ale jakoś nigdzie nie mogę znaleźć rozwiązania.

1

Polecam zajrzeć do przykładów w dokumentacji Qt jak oni to rozwiązują ale w skrócie - instancje wszystkich klas trzymasz w MainWindow ( głównej klasie aplikacji ), connect tam gdzie masz buttona czyli w Twoim przykładzie powiedzmy że w konstruktorze MainWindow no a slot w klasie z którą łączysz akcje np wciśnięcia przycisku.
Naprawdę polecam zajrzeć do przykładów aplikacji Qt wtedy wszystko powinno być już dla Ciebie jasne ;)
Pozdrawiam ;)

1

Zainteresuj sie MVC.

0

Właśnie jeśli chodzi o MVC, nie potrafię jakoś tego ogarnąć co by miało być w moim przypadku w modelu, kontrolerze i widoku.

0

Tak się zastanawiam czyli załóżmy że mam zrobione MainWindow, NowaGraWindow, NowaGraController.

W MainWindow jest przycisk Start.

1) Instancja NowaGraController jest składnikiem MainWindow.
2) Klasa NowaGraController zawiera slot dla przycisku Start.
3) Connect w MainWindow jest zdefiniowany tak ze wywoluje slot na rzecz obiektu NowaGraController.
4) Składnikiem klasy NowaGraController jest NowaGraWindow.
5) Slot w NowaGraController powoduje rysowanie NowaGraWindow.
6) Teraz jest przycisk Zatwierdź w NowaGraWindow.
7) Składnikiem klasy NowaGraWindow jest GraController.
8) Connect dla Zatwierdź jest tak zdefiniowany że powoduje wywolanie slotu w GraController.
9) Składnikiem GraController jest GraWindow, które jest rysowane w slocie dla przycisku Zatwierdź
.
.
.itd

Dobrze myślę?

1

Ad 4 Nie. Kontroler tylko pośredniczy w wymianie informacji miedzy użytkownikiem a modelem i aktualizuje widok.
Tutaj jest ładnie opisany MVC http://doc.qt.digia.com/qq/qq10-mvc.html

0

To powiedz mi jeżeli mam klase Mecz. I pętla leci po 15 biegach meczu żużlowego. Dane wszystkie wyniki musza byc trzymane na czas calego meczu tzn caly czas musi istnieć obiekt Mecz. Po każdym biegu wyniki są prezentowane na Widgecie. W takim razie gdzie ma powstać instacja Mecz ? W Controllerze ? Skoro w kontrolerze nie istnieje zaden widget to jak on ma go odświeżać?

1

W głównej klasie aplikacji tworzysz klasę kontrolera pod którą podpinasz elementy GUI, zasada jest prosta - użytkownik ma dostęp TYLKO do kontrolera. Ten modyfikuje model ( którego klasę też masz w głównym oknie ) w którym jest cała logika. Następnie łączysz za pomocą SIGNAL&SLOT model z widokiem tak żeby widok mógł się odrysować gdy dane w modelu zostały zmienione. Mam nadzieje że teraz jest to dla Ciebie jasne ;)

0
emacs napisał(a):

W głównej klasie aplikacji tworzysz klasę kontrolera pod którą podpinasz elementy GUI,

To jak w klasie kontrolera są elementy GUI tzn buttony itd ? :/ bo teraz mnie trochę zmyliłeś.

W MainWindow tworzę obiekt widoku i kontrolera ? To po co ten kontroler co w nim ma być? Teraz się pogubiłem.

Jak kontroler modyfikuje model skoro model ma byc stworzony w widoku?

Czyli sygnały tworzę w modelu a gniazda w widoku?

Widoków też trzeba tworzyć tyle ile trzeba a one maja byc tworzone w MainWindow.

1

Zobacz zaakceptowana odpowiedź tu http://stackoverflow.com/ques[...]model-view-controller-example
Kontrolerem w Qt bardzo często jest po prostu główna klasa aplikacji która pośredniczy za pomocą sygnałów i slotów między modelem i widokiem.
Czyli np gdy użytkownik w GUI na widoku ( np QListView ) zaznacza jakiś element i naciska przycisk "delete" to łączysz sygnał clicked() tego buttona w głównej klasie ze swoim slotem w którym wywołujesz na modelu model.remove() a model aktualizuje sobie widok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0