QT-C ++ vs Ogólny C ++ i STL [zamknięte]


19

Ostatnio odświeżyłem mój C ++, na Ubuntu QQ. Uwielbiam strukturę Qt do wszystkiego, szczególnie do tworzenia GUI. W ciągu ostatnich kilku lat bardzo się z tym zapoznałem.

Podczas korzystania z PyQt miałem pewne problemy, które są teraz bardziej wyraźne podczas używania C ++ z Qt: Qt ma wiele rozszerzeń C ++, które są specyficzne dla Qt - QString jest tylko jednym częstym przykładem, nie wspominając o automatycznym usuwaniu śmieci. Możliwe jest pisanie aplikacji Qt przy użyciu C ++ bez wiedzy o C ++ i STL.

Być może wkrótce będę musiał ponownie wejść na rynek pracy i chciałbym móc rozważyć stanowiska w C ++ - ale obawiam się, że zbytnie związanie się z Qt ograniczy moje umiejętności do pracy z ogólnym C ++, które kiedyś były dość groźne, ale są teraz długo uśpione i zardzewiałe.

Czy powinienem unikać Qt? Czy lepiej byłoby używać WxWidgets lub GTK ++ do tworzenia GUI?

Jaka jest najlepsza platforma GUI do użycia, która pozwala / wymaga największego wykorzystania ogólnego C ++ i STL? Jak mogę stać się najbardziej zbywalnym jako programista C ++, jeśli chodzi o frameworki GUI itp.?

Odpowiedzi:


15

Nie powstrzymałbym się od używania Qt tylko z tych powodów. Nie musisz używać wszystkich klas użyteczności Qt; w przypadku tych, które zastępują STL, będziesz co najwyżej zmuszony do użycia QString i ewentualnie QStringList. Ponadto program zwykle zawiera znacznie więcej niż GUI. Zawsze możesz używać wyłącznie ogólnego C ++ do końca programu, a Qt tylko do GUI.

Moim zdaniem praca z STL polega raczej na zrozumieniu, jakie podstawowe struktury danych są używane i ich złożoności, a tym samym w jakich momentach powinieneś używać każdego kontenera. A jeśli chodzi o programowanie w C ++, chodzi przede wszystkim o umiejętność korzystania z bardzo niezbędnego nagłówka <algorytm>, który powinien również działać na kontenerach Qt, ponieważ są one kompatybilne z STL.

Nie widzę żadnej szkody w korzystaniu z tych wszystkich rozszerzeń, które zapewnia Qt, o ile wiesz (lub przynajmniej masz ogólne pojęcie o tym) jak są one implementowane wewnętrznie. Upewnij się, że wiesz, że rzeczy takie jak Q_OBJECT, SIGNAL (), SLOT (), foreach (), nie są magiczne, ale makra, które rozwijają się do prawidłowych instrukcji C ++. Na przykład zrozumienie, w jaki sposób niejawnie współużytkowane klasy i relacje rodzic-dziecko, które sprawiają, że Qt wydaje się bardziej podobne do Javy, nie jest wcale takie skomplikowane. Zawsze możesz spróbować odtworzyć niektóre funkcje w osobnym projekcie, aby sprawdzić, czy możesz to zrobić za pomocą ogólnego C ++, a następnie nie czuć się źle, używając ich w Qt.

Spójrz także na biblioteki Boost. Zapewniają dodatkowe narzędzia, których nie ma standardowa biblioteka C ++, i są naprawdę dobrym sposobem na zbliżenie się do ogólnego C ++, ponieważ zasadniczo przestrzegają tych samych konwencji, co ogólny C ++. Niektóre biblioteki mają dość złożone klasy szablonowe, a samo po prostu zrozumienie, w jaki sposób działają, jest samo w sobie dobrym studium w C ++. Wzmocnienie ma wiele narzędzi, których nie można znaleźć w Qt, a inne, które implementują takie same lub podobne pojęcia jak niektóre klasy Qt i mogą być używane zamiast nich.

Jeśli trafisz na rynek pracy, pracując z C ++, istnieje szansa, że ​​będziesz pracować z Qt lub innym frameworkiem, który podobnie jak on, będzie miał własne klasy narzędzi, które starają się uprościć C ++.


4
+1 za „Zawsze możesz używać wyłącznie ogólnego C ++ do końca swojego programu, a Qt tylko do GUI.”
Md Mahbubur Rahman

@MahbuburRAaman - tak - to doskonała rada. Używaj Qt tylko do GUI i tego, co jest konieczne, aby podłączyć się z powrotem. Napisz resztę za pomocą Generic C ++, STL, Boost - narzędzi, które są powszechnie używane.
Wektor

5

Zgadzam się z większością pochwał Qt, ale pytanie brzmiało: Jaka jest najlepsza struktura GUI do użycia, która pozwala / wymaga największego wykorzystania ogólnego C ++ i STL? Pod tym względem Qt jest trochę schizofrenikiem: powiela kontenery STL i algorytmy własnymi zwrotami. Zapewnia również pojemniki, które różnią się od STL. Interoperacyjność między Qt i STL nie zawsze jest płynna. W niektórych przypadkach potrzeba kilku wywołań funkcji, aby dostać się std::stringdo QStringiz powrotem.

wxWidgets ma opcję kompilacji STL, która wykorzystuje wyłącznie kontenery STL - nie ma równoległego wszechświata z domowymi zamiennikami, jak w przypadku Qt. Kompiluje również ze standardowym kompilatorem C ++ bez potrzeby niestandardowych rozszerzeń. Jest to wysokiej jakości platforma GUI, którą warto rozważyć.

Możesz także spojrzeć na gtkmm, który jest opakowaniem C ++ wokół GTK +. Jest bliżej spełnienia pierwszego wymagania niż Qt.


1
„wxWidgets ma opcję kompilacji STL, która wykorzystuje wyłącznie kontenery STL ...” - Rozumiem - to WAŻNE, aby wiedzieć. „W niektórych przypadkach przejście od std :: string do QString wymaga kilku wywołań funkcji” - zrozumiałe - jeszcze tego nie zbadałem. Jestem trochę zaznajomiony z GTK i Wx - ale Qt wydaje się świecić w porównaniu, przynajmniej z mojej perspektywy - C ++ NIE jest moim pierwszym językiem - pochodzę ze świata Clipper / Delphi, a następnie nauczyłem się C ++, ponieważ miałem do czynienia z Winem 32s itp.
Wektor

2

Nie martwiłbym się zbytnio o nieużywanie określonych bibliotek STL, takich jak std :: string lub std :: iostream lub std :: vector. Ekwiwalenty QT mają inny smak, ale nie są tak odległe, aby stanowić problem.

Moim zdaniem bardziej idiomatyczną różnicą wydaje się być styl programowania intensywnie wykorzystywany newdo alokacji. Podczas gdy w przypadku programu QT może to być w porządku dla części Gui, zaletą C ++ i RAII jest to, że faktycznie można przechowywać wiele danych na stosie zamiast na stercie. Przechodząc do pisania kodu innego niż GUI, powinieneś to sobie przypomnieć.


1
chodziło mi o to, że przydział sterty jest ogólnie zły, nie jest to po prostu najlepsza rzecz dla zmiennych lokalnych. Klasy GUI zwykle żyją długo i najlepiej przydzielać je na stos, zmienne lokalne, które są potrzebne tylko tymczasowo, dobrze działają na stosie. w C # z Garbace Collection zostaną wkrótce zniszczone, więc sterty też są w porządku. Ale w przypadku ręcznych new/deletepołączeń nie jest to takie łatwe i podatne na błędy. W krytycznych sekcjach (obsługa dużych zbiorów danych) może to mieć znaczenie, szczególnie deletepołączenia mogą być dość powolne.
wirrbel 21.04.13

1
nie jest to problem 10000 obiektów interfejsu użytkownika, ale złożonych struktur drzewiastych z milionami wpisów itp., w których kiedyś można było zastosować inteligentniejsze sposoby alokacji rzeczy (alokacja zbiorcza lub wiele inteligentnie napisanych klas kryteriów itd.). Wniosek: kupa nie jest zła, trzeba ją mądrze wykorzystać. Sposób Qt czasami nie jest skalowany dla innych rzeczy. Moim zdaniem jest to wciąż wspaniały zestaw narzędzi.
wirrbel 21.04.13

A co powiesz na C ++ 11? wydaje się, że inteligentne wskaźniki itp. rozwiałyby wiele twoich obaw. Właśnie zaczynam się z tym bawić. Jak powiedziałem, zgadzam się, że Qt KICKS BUTT. Mój plan polega na użyciu Qt do GUI i robieniu wszystkiego, co mogę, używając C ++ 11 - co wydaje się znacznie poprawiać, na przykład, przestarzałe i w dużym stopniu wypełnia luki między Java / C # a old school C ++. Mam wrażenie (w tym miejscu z dystansu, co prawda), że kombinacja Qt i C ++ 11 może być dużym zwycięzcą.
Wektor

2
Myślę, że rozumiesz: masz wiele opcji w C ++, w c ++ musisz mądrze wybierać. Inteligentne wskaźniki itp. Również mają problemy. Masz dość C #, możesz spojrzeć na dlang.org, który robi wiele rzeczy lepiej (GCed).
wirrbel 21.04.13

Tymczasem muszę stworzyć łańcuch narzędzi, który obsługuje C ++ 11. Obecnie używam kodelitu - bardzo ładne IDE - ale po wyjęciu z pudełka (kompilator GNU) nie obsługuje 11, jak się właśnie dowiedziałem ... Może ja może podłączyć do niego kompilator zgodny z 11. Nie zamierzam zaczynać od D, Boo itp. Itd. - jak powiedziałem w tym pytaniu, być może wkrótce będę musiał dość szybko trafić na rynek pracy i chcę mieć główne języki rynkowe, a nie te jednorazowe. Mnóstwo miejsc pracy w Pythonie - szkoda, że ​​nie mogę już dłużej znieść Pythona!
Wektor
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.