Qt i obiektowość

0

Cześć,

Mam do Was takie pytanie - od niedawna pracuję z Qt i m.in. QtDesignerem. Tworzę piękne okno i widgetami i teraz mam pytanie.
Żeby obsłużyć te wszystkie widgety, okna, stworzyć połączenia (sygnał, slot) pomiędzy nimi to wszystko muszę utworzyć w klasie w której posiadamy ten formularz, czyli która wszystko zawiera. Przez te wszystkie dodatki klasa ta bardzo się powiększy. Czy zatem da się tutaj jakoś zastosować obiektowość? Nie za bardzo przecież można wydzielić coś do nowej klasy, bo wtedy nie utworzymy połączenia między elementami, które zawiera nowa klasa, bo nie będzie znała pozostałych z tej duzej.

Co więcej, gdybyśmy tworzyli jeszcze jakieś elementy dynamicznie w już istniejących widgetach, to wielkość tej klasy jeszcze bardziej rośnie. Czy w związku z tym tworzenie GUI z tym się wiąże, że trudniej o tę obiektowość?

Pozdrawiam

3

Bardzo się powiększy? Sprawdź to. Na 99% optymalizujesz w oparciu o błędne zrozumienie problemu (którego nie ma), powodując koszty w innych miejscach systemu.

1

Powinieneś w klasie GUI programować GUI, a w innych klasach skomplikowane funkcjonalności.

1

"Nie za bardzo przecież można wydzielić coś do nowej klasy, bo wtedy nie utworzymy połączenia między elementami, które zawiera nowa klasa, bo nie będzie znała pozostałych z tej duzej. "

Cała magia signal slot polega właśnie na tym że klasy nie muszą "znać się" nawzajem (nie musisz załączać include nawzajem). Mogą być osobnymi niezależnymi bytami. Załączasz include jedynie w miejscu kodu(tam gdzie funkcja main) w którym łączysz sygnał ze slotem poprzez metafunkcje connect(). Jeśli rozumiesz jak działa MOC to nie będziesz wnikał już co on dokładnie tworzy - odrabiając brudną robotę startcznych callbacków za Ciebie - przejrzyj pliki moc_***.cpp to zobaczysz jaką treść realnie otrzymuje kompilator po przygotowaniu go przez matakompilator qmake a jaką widzisz pisząc program.

Gdybyś nie łączył singal ze slot tylko operował własnymi funkcjiami w sposób jaki wydaje ci się tworzyć problem np. w sygnale clicked() MainWindow chcesz wywołać pojawienie się okna AboutWindow. W klasycznym trybie musisz załączyć include definicji GUI drugiego okna i wywołasz QWindow::show(); W trybie używania signal slot te klasy komunikują się jakby kanałem sygnałów jedyne co to MOC musi wiedzieć do jakiej funkcji callback wstawić funkcję z jakiej klasy. To jest bardzo proste w zorzumieniu. Poleca zacząć od zrozumienia MOC reszta wyda się łatwa.

Nie jest to być może tak intuicyjne jak C# albo VCL - event i property ale niewątpliwie bardziej obiektowe podejście. I nie ma znaczenia czy obiektem jest widget czy jakiś obiekt worker.

1

Apropos.. problem który zauważyłeś chyba wynika z tego że wpisujesz connect w ciele klasy głównego okna więc ci się to rozrasta a nijak nie widać obiektowości. Bo nie korzystasz poprawnie z mechanizmu sygnałów i slotów który Ci jedynie wtedy komplikuje przejrzystość. Jeśli używaż Qt5 to na bank klasa obiektów ui jest osobną względem głównej logiki okna a zawartej jako składnik tej logiki. Nie ma żadnego problemu z tworzenie dodatkowych klas np. klasy zawierającej rozmaite formy aplikacji - kilka wersji w jednym programie. Tworzone zależnie od platformy, decyzji podczas uruchomienia. Dlatego warto connect łączyć o ile można poza ciałem klas widgetów. Wtedy zobaczysz tą obiektowość. Połączenia sygnał slot będą jedynie niciami łączącymi nieznane sobie obiekty.

Wówczas możesz się skupić na poszczególnych oknach i ich wewnętrznej mechanice a w main łączyć niciami porozumienia. Jeśli program uruchomiony będzie np. w niskiej rozdzielczości albo wysokiej rozdzielczości zamiast tworzenia dużego okna stworzysz mniejsze i połączysz sygnał slot menu w ikonie tray z wybraną formą. Możesz połączyć nawet pińcet form do jednego sygnału każda będzie robiła to samo będąc oknem innego kształtu, ułożenia.. zależnie od widzimisie decydować które okno zobaczy user.

Np. mini okno i okno z wszystkimi opcjami.. mega obiektowośc stoi za Qt tylko trzeba myśleć w sposób obiektowy - myśleć w ten sposób można łatwo - mając na uwadzę słowo klucz:
prywatność. Zapraszasz dziewczynę na randkę to zapraszasz na randkę jedyne co o niej wiesz to np. numer telefonu. Gdyby nie obiektowo ją poznać - widział byś ją już nago, gdzie mieszka co robi.. całą przezroczystą po to tylko żeby QButton:: clicked()

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