Dzielenie wspólnego obiektu między wigetami w QT

0

Cześć,

mam następujące pytanie. Tworzę projekt w QT/GUI i mam MainWindow + 2 wigety, które są obsługiwane przez osobne klasy, wigety są nakładane na okno główne.
Chciałbym, aby każda z klas zarządzająca danym wigetem miała dostęp do wspólnego obiektu. W jaki sposób mogę przekazać referencję/wskaźnik do tych klas?
Powiedzmy, że mam np. klasę DbManager i w klasach Foo i Bar chciałbym mieć dostęp do metod tej klasy. Czy obiekt DbManager powinnien być utworzony w MainWindow i wtedy przekazany do Bar i Foo?

Kod poglądowy: http://pastebin.com/5aUwpUuG

1

Zależy jak chcesz zarządzać czasem życia tego obiektu. Jeśli z góry go znasz, np. będzie równy z czasem życia MainWindow to niech MainWindow go agreguje, a pozostałym widgetom przekaż obserwujący wskaźnik. Jeśli nie wiesz (np. masz osobne widgety-okienka, user może je zamknąć kiedy chce w dowolnej kolejności), zainteresuj się QSharedPointer/std::shared_ptr

0

@kq a w jaki sposób technicznie to napisać. Dostać się z konstruktora MainWindow do Foo i Bar?

0

MainWindow niech będzie przekazane wskaźnikiem czy tam referencją do Foo i Bar, a Foo i Bar niech pobiorą sobie pointer do tej udostępnianej klasy getterem. Sensu std::shared_ptr chyba nie ma jeśli MainWindow przeżyje instancje i klasy korzystające nie będą mogły zniszczyć instancji udostępnianej, Foo i Bar, jeśli tak nie jest to std::shared_ptr zwracany getterem. W sumie to @kq napisał to samo, nie wiem czego nie zrozumiałeś.

2

Im klasy są dla siebie bardziej "obce" tym lepiej.
W Qt głównym mechanizmem tworzenia relacji między obiektami są sygnały i sloty. Dla architektury programu jest to super rozwiązanie.
Ogólnie widgety (widoki) nie powinny siebie znać na wzajem, tylko MainWindow (które w Qt pełni rolę kontolera) łączy je odpowiednie do kupy razem z jakimś modelem danych (bazą danych).
Tak zmierzam do wzorca projektowego MVC.
Naprawdę kod napisany zgodnie z tymi zasadami, jest łatwiejszy w utrzymaniu i zrozumieniu.
W tym wzorcu:

  • MainWindow zna wszystkich, ale nikt nie zna MainWidow
  • Model danych (baza danych) nie zna nikogo a jest znana dla MainWindow i dla widoku który ją będzie wyświetlać
  • widget zna tylko to co ma wyświetlić, a wszelkie ważne zmiany danych wykonuje na modelu danych, a informacje o własnym zmienie stanu emituje jako sygnał

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