Framework Qt

W ramach podcastu “Porozmawiajmy o IT” miałem okazję porozmawiać z Łukaszem Kosińskim o frameworku Qt.

Posłuchaj naszej rozmowy w wersji audio 🎧 👇

Mój dzisiejszy gość to wieloletni ekspert i entuzjasta frameworka Qt, ma doświadczenie w pracy nad cross platformowymi projektami Qt dla branży medycznej, motoryzacyjnej, a także z obszaru elektroniki konsumenckiej i obronności. Sam siebie opisuje jako specjalistę od Qt i QML z silną znajomością C++. Założyciel Scythe Studio, firmy świadczącej usługi w zakresie oprogramowania Qt. Moim i Waszym gościem jest Łukasz Kosiński.

Cześć, Łukaszu! Bardzo mi miło gościć Cię w podcaście.

Cześć, Krzysiek, dzięki za zaproszenie.

Dzisiaj z Łukaszem będę rozmawiał o frameworku Qt, czyli takim zestawie przenośnych bibliotek, narzędzi programistycznych do m.in. takich języków, jak C++ czy QML z silnym przeznaczeniem do budowy interfejsów graficznych programów komputerowych, tak ogólnie rzecz biorąc, a za chwilę Łukasz to na pewno rozwinie w większych szczegółach.

Zanim do tego przejdziemy, to chciałbym Cię jednak, Łukasz, zapytać, standardowo, jak to u mnie w podcaście na początku, czy słuchasz podcastów. Jeśli tak, to może masz jakieś swoje ulubione audycje, o których chciałbyś powiedzieć?

Ja niekoniecznie słucham podcastów, przynajmniej nie w tej takiej typowej formie, że jest tylko dźwięk. Często oglądam jakieś takie pogadanki, one sobie nawet lecą w tle, nie oglądam wideo. Taki format też się liczy?

Mam wrażenie, że obecnie definicja podcastu się mocno rozciągnęła i nawet niektóre kanały na YouTube nazywają się też podcastami, myślę, że można do tego dosyć swobodnie podejść. Mam wrażenie, że wtedy chodzi głównie o to, że główna wartość merytoryczna tego przekazu jest audio, więc jak najbardziej.

Idąc tym tropem, są dwie takie audycje typowo podcastowe, których słucham. Jeden podcast nazywa się Nowoczesna sprzedaż i marketing, to jest autorstwa Szymona Negacza. I słucham też Slow German w wykonaniu Annik Rubens i słucham jeszcze Przygód przedsiębiorców.

Bardzo fajny zestaw. Te polskojęzyczne kojarzę, obcojęzycznych niestety nie, ale na pewno te, które wymieniłeś, zdecydowanie warto polecić.

To może zaczniemy dosyć standardowo. Muszę Ci powiedzieć, że jeszcze tutaj na moim kanale pomimo tych stu osiemdziesięciu paru odcinków nie dotknąłem nigdy tematów związanych z C++, więc to jest taki pierwszy raz i myślę, że warto byłoby przybliżyć trochę słuchaczom to, czym właściwie jest framework Qt.

Zacznijmy od tego, że nazwę samego frameworka wymawia się różnie. Do pewnego momentu myślałem, że oficjalna wymowa to [kjut], tak jak ‘słodki’ po angielsku, ale potem pojechałem na jakiś event organizowany przez samych twórców frameworka i też się zdarzało, że oni wymawiali to [kjuti], tak że nie ma jednej szkoły. Ja mówię [kjut]). Jest to framework do C++. Oryginalnie główne przeznaczenie było takie, że z jego wykorzystaniem robiło się głównie interfejsy u użytkownika na desktopy, początkowo na Linuxy. Od dłuższego już czasu zdecydowanie ten framework wyszedł już poza te ramy i wspiera bardzo wiele platform, zarówno jeśli chodzi o implementację logiki biznesowej, czyli komunikacji po sieci, sensorów, bluetootha, tego typu rzeczy, jak i samo GUI.

Jeżeli chodzi o te wspierane platformy, to początkowo był Linux, potem dodali wsparcie dla Windowsa i ówczesnego macOS-a, ale teraz też z powodzeniem Qt działa na platformach mobilnych, tzn. na androidzie i iOS-ie. W międzyczasie mieli jakiś romans z innymi mobilnymi systemami, których nazw nawet nie pamiętam.

Obecnie można powiedzieć, że Qt święci triumfy na urządzeniach wbudowanych, tzn. wszędzie tam, gdzie programuje się tzw. Human Machine Interface, czyli żeby ująć to najbardziej obrazowo, różnego rodzaju ekrany dotykowe lub nie, gdzie jest ta interakcja człowiek — ekran, człowiek — maszyna, np. ekrany na sprzęcie medycznym, na urządzeniach, maszynach. Obecnie często wrzuca się Qt-a do kokpitów samochodowych. Pewnie jeszcze o tym pogadamy.

Obecnie można powiedzieć, że Qt święci triumfy na urządzeniach wbudowanych, tzn. wszędzie tam, gdzie programuje się tzw. Human Machine Interface, czyli żeby ująć to najbardziej obrazowo, różnego rodzaju ekrany dotykowe lub nie, gdzie jest ta interakcja człowiek — ekran, człowiek — maszyna, np. ekrany na sprzęcie medycznym, na urządzeniach, maszynach. Obecnie często wrzuca się Qt-a do kokpitów samochodowych.

Czyli znacznie szerzej, niż to było na początku. Powiem Ci, że kiedy zaczynałem się bawić w programowanie — bo chyba tego inaczej nie można nazwać, przepisując jakieś fragmenty z Bajtka i innych tego typu rzeczy — to wtedy, pamiętam, ten framework już istniał. I to jest dosyć ciekawe, jak bardzo zakorzenił się na rynku, jak bardzo się rozwinął też na inne poza pierwotnymi zastosowaniami.

Chciałbym teraz właśnie Cię zapytać o historię tego frameworka, o jego rozwój, by myślę, że też jest w sumie kawał czasu jak na branżę IT do przekazania.

Fakt. Qt jest z nami jest już od lat 90. Nie będę może tutaj rzucał konkretnymi datami albo jeśli rzucę, to będzie to do sprawdzenia przez Twoich słuchaczy, ale wydaje mi się, że pierwsze oficjalne wydanie było w 1995 r. Wtedy właśnie Qt służył głównie do robienia GUI na desktopy z wykorzystaniem C++. Również w open source’owych projektach Qt dosyć mocno się zakorzenił i do tej pory jest wykorzystywany chociażby przez KDE. To jest, nie wiem, czy kojarzysz, taki system graficzny…

Linuxowy.

Tak jest. Tak że całe KDE stoi na Qt. Później dodali, tak jak wspominałem, wsparcie dla Windowsa i Maca. W okolicach 2012 r. wyszedł Qt w wersji 5. I to była swego rodzaju rewolucja, bo zrezygnowali z wielu starych rozwiązań i wprowadzili moduł, który nazywa się Qt Quick, i wraz z tym modułem wrzucili do frameworka swój własny wewnętrzny język programowania QML, który jest wykorzystywany głównie przy tworzeniu interfejsu graficznego trochę innego od takich typowych okienkowych aplikacji, szczególnie przy implementacji GUI na ekrany dotykowe bardzo przyjemnie się z niego korzysta. I od tamtego momentu właśnie Qt zaczął być tak bardzo doceniany, jeżeli chodzi o programowanie GUI na ekrany dotykowe.

Mówimy tu o frameworku, to może dawać takie trochę mylne pojęcie, że mówimy o jakimś monolitycznym rozwiązaniu, natomiast w rzeczywistości to jest bardzo wiele różnych bibliotek; elementów składowych narzędzi.

Z jakich modułów, z jakich elementów, z jakich narzędzi składa się ten framework i cały ekosystem?

Właśnie, bo to jest też kwestia tego, że Qt sam w sobie jest dosyć spory, tzn. tam jest sporo takich rozwiązań, które w innych technologiach w ogóle poza frameworkiem istnieją jako oddzielne rozwiązania, oddzielne zależności, a w samym Qt dużo się znajdzie. Qt dostał taką łatkę, że jest tylko do GUI, ale tak de facto można bardzo długo rozwijać aplikację tylko i wyłącznie o moduły tego frameworka, bez konieczności korzystania z jakichś zależności, do implementacji jakiejś specyficznej komunikacji z urządzeniami zewnętrznymi albo coś takiego.

To może od początku. Jeżeli chodzi o moduły Qt-a, ich jest naprawdę masa. The Qt Company albo szerzej społeczność, która stoi za rozwojem frameworka, bo on też jest swoją drogą open source, dokonała takiego podziału na moduły, które są Essentials, czyli które są takim fundamentem dla wszystkich modułów; to są takie najczęściej wykorzystywane moduły i tam znajdują się m.in. te moduły do robienia GUI.

Swoją drogą poza Qt Quick, o którym wspomniałem, istnieje też moduł Qt Widgets , który służy do tworzenia GUI takiego typowo okienkowego, typowo desktopowego; na ekrany dotykowe za specjalnie się nie nadaje, ale tam, gdzie jest myszka, klawiatura, to nadaje się idealnie. Tym bardziej, że te Widgety domyślnie podążają za wyglądem systemu, tzn. piszemy jeden kod, jakiejś aplikacji okienkowej, mamy tam jakieś przyciski, jakieś listy, radio buttony, tego typu rzeczy, i na Windowsie to będzie wyglądać jak typowa natywna Windowsowa aplikacja, ale odpalimy to sobie na Macu, np. na ciemnym motywie, i bez konieczności jakiejś adaptacji kodu aplikacja będzie wyglądać jak natywna również na Macu. Tak że ten moduł też jest fajny i on jest starszy od Qt Quick.

A teraz rozwijam się trochę, jeżeli chodzi o wykorzystywanie tych dwóch modułów do robienia GUI, ale są dwa obozy obecnie, jeżeli chodzi o rozwój GUI z wykorzystaniem Qt. Jest właśnie ten obóz widgetowy i obóz Qt Quick. U mnie w firmie korzystamy zdecydowanie bardziej z modułu Qt Quick, z uwagi na specyfikę projektów; więcej projektów korzysta obecnie z ekranów dotykowych i ma bardziej zaawansowany interfejs użytkownika, z wieloma animacjami, efektami. Wtedy właśnie warto korzystać z tego modułu. A Qt Widgets nadal świetnie się nadaje do tworzenia szybkich aplikacji; aplikacji typu narzędzia.

Kontynuując — Essentials. Opowiedziałem o tych modułach do tworzenia GUI. Poza tymi modułami jest m.in. moduł Qt Core, który w moim rozumieniu jest taką przyprawą dla C++, tzn. wprowadza pewne koncepty, kóre ułatwiają programowanie w C++. Mowa tu m.in. o mechanizmie sygnałów i slotów, który jest swoją drogą obecny też w Bust. Nie sprawdzałem tego, ale obstawiam, że Qt był pierwszy.

To jest taki mechanizm, który pozwala na dosyć prostą implementację komunikacji pomiędzy obiektami albo wewnątrz samego obiektu, na zasadzie zderzenia i reakcji. Poza tym m.in. Qt wprowadza do C++ coś takiego, co się nazywa Meta Object Compiler. Można powiedzieć, że jest to taki dodatkowy krok w kompilacji i on szuka typowych dla Qt-a Mac C++ słów kluczowych, na podstawie tego generuje jakiś swój kod i w ten sposób dodaje tę swoją magię, która pozwala właśnie na sygnały i sloty, ułatwia również zarządzanie pamięcią.

Często C++ jest ganiony za to, za zarządzanie pamięcią, i w Qt to też zostało rozwiązane, nie tylko z wykorzystaniem inteligentnych wskaźników, ale również z wykorzystaniem tzw. drzewa obiektów systemu rodzic — dziecko. I to mniej więcej działa w ten sposób, że jak tworzymy jakiś obiekt, to przekazujemy mu rodzica i on zostanie usunięty wraz z rodzicem, więc jak juz o tym pamiętamy, to nie musimy się za specjalnie martwić zwalnianiem pamięci.

I to mniej więcej tyle, jeżeli chodzi o Qt Essentials. Tam znajdziemy najprawdopodobniej również moduły do komunikacji sieciowej, do testów — takie bardziej standardowe moduły.

Poza tymi modułami Qt Essentials znajdziemy również moduły, które nazywają się Add-ons. I tam już znajdziemy bardziej specyficzne rozwiązania, jak np. sensory, takie jak żyroskop albo różne tego typu rozwiązania, które znajdziesz w swoim telefonie. Albo coś do 3D, albo bluetooth, albo coś do pobierania Twojej aktualnej geolokalizacji, coś do wyświetlania map — różne takie rzeczy, które są zazwyczaj w innych technologiach poza frameworkiem, a w Qt są częścią frameworka.

I tutaj ważna uwaga — Qt Essentials mają gwarantowaną kompatybilność pomiędzy wszystkimi platformami wspieramymi przez Qt, tzn., że Qt jest wspierany na wszystkich desktopach, na mobilkach, na mikrokontrolerach i mamy gwarancję, że Qt Essentials będą równie wspierane na tych wszystkich platformach.

Z kolei, jeżeli chodzi o Qt Add-ons, to tam mogą być różnice, zazwyczaj jest tak, że dosyć szybko ta różnica jest nadrabiana i dla przykładu: był moduł Qt NFC, w którym brakowało wsparcia dla AIOS-a, i względnie szybko takie wsparcie dodali.

Rozumiem, czyli znowu dosyć mocno wychodzimy poza te pierwotne zastosowania związane z GUI. Jak już jesteśmy przy tych zastosowaniach, to chciałbym Cię zapytać właśnie o branże czy te obszary, gdzie ten framework Qt najlepiej się odnajduje.

Będę odpowiadał chyba z uwagi na moje doświadczenie, jak ja to widziałem do tej pory. Z mojej perspektywy ciekawą zaletą Qt-a jest to, że jako programiści mamy naprawdę wachlarz różnych projektów dla różnych branż. Tak jak wspominałem, z uwagi nie tylko na tę zawartość frameworka, o której wspomniałem, ale z uwagi też na inne cechy, jak np. wydajność, wyjątkowa cross platformowość, z uwagi na niektóre elementy frameworka, które są dedykowane danej branży, jak np. dla automotive są całe pakiety narzędzi i małych modułów, które właśnie są dedykowane tej branży, to Qt jest wykorzystywany w wielu branżach.

I przede wszystkim branża automotive, w szczególności obecnie w nowych furach często pakowane są ekrany dotykowe. To jest taki, można powiedzieć ogólny trend, że z desek rozdzielczych zabierają nam guziczki i wszystko pakują w soft. Kiedyś miałem taką listę marek, które wykorzystują albo wykorzystywały Qt, i naprawdę znalazła się tam cała topka marek samochodowych: Ford, Mercedes, Tesla itd. bazują albo bazowały na Qt.

Akurat u mnie Qt najczęściej by wykorzystywany do projektów medycznych, tzn. był np. zespół, który pracował nad jakąś robotyką, skanerami do ciała, nad czymś, co grzebało w człowieku, ale lekarz musiał w jakiś sposób kontrolować to, co tam się dzieje i potrzebny był ekran. I również do takich celów Qt jest często wykorzystywany.

Poza tym automatyka przemysłowa — tzn.podobny scenariusz, że mamy jakąś maszynę, jakieś urządzenie i potrzebny jest jakiś ekran, aby to kontrolować. I w dalszym ciągu jest wykorzystywany również do typowych aplikacji desktopowych.

Jeżeli chodzi o aplikacje mobilne, to Qt już nie jest taki popularny. Umówmy się, to jest technologia cross platformowa i rozwiązania natywne, jeśli ktoś ma budżet i czas, zawsze będą lepsze, ale Qt ma tutaj taką zaletę, że, powiedzmy, mamy już kupę kodu napisanego z wykorzystaniem C++ i Qt i mamy zespół, który ma jakiś zestaw umiejętności, wówczas bez potrzeby douczania się czegoś nowego, bez potrzeby angażowania innych ludzi możemy zrobić aplikację mobilną. To nazywa się chyba Companion App albo Companion Screen i to też jest dosyć częsty case dla tego frameworka.

W tych różnych, takich trochę specyficznych branżach Qt jest często wykorzystywany z uwagi na to, że dosyć łatwo się go integruje z innymi, niższymi technologiami, tzn. np.jeżeli chodzi o jakąś robotykę, o systemy wbudowane, to tam sporo pisze się w C, i o ile osobiście w tym nie grzebałem, o tyle zdarzało się wykorzystywać biblioteki, narzędzia, które były napisane w C, i z uwagi na to łatwo integrować nowoczesną aplikację napisaną w Qt z robotyką.

W tych różnych, takich trochę specyficznych branżach Qt jest często wykorzystywany z uwagi na to, że dosyć łatwo się go integruje z innymi, niższymi technologiami, tzn. np.jeżeli chodzi o jakąś robotykę, o systemy wbudowane, to tam sporo pisze się w C, i o ile osobiście w tym nie grzebałem, o tyle zdarzało się wykorzystywać biblioteki, narzędzia, które były napisane w C, i z uwagi na to łatwo integrować nowoczesną aplikację napisaną w Qt z robotyką.

👉 Czytaj dalej na: https://porozmawiajmyoit.pl/poit-185-framework-qt/

--

--

Dev and life blog. Thoughts about programming, design patterns, Ruby and life.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store