POIT #185: Framework Qt

Witam w sto osiemdziesiątym piątym odcinku podcastu „Porozmawiajmy o IT”. Tematem dzisiejszej rozmowy jest framework Qt.

Dziś moim gościem jest Łukasz Kosiński – 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 opisuj jako specjalistę w Qt i QML z silną znajomością C++. Założyciel Scythe Studio – firmy świadczącej usługi w zakresie programowania Qt.

W tym odcinku o Qt rozmawiamy w następujących kontekstach:

  • czym jest framework Qt?
  • jaka jest historia jego powstania i rozwoju?
  • z jakich modułów się składa?
  • w jakich branżach jest używany?
  • czym jest język QML i czy można go mieszać z C++?
  • jak Qt wypada w porównaniu do takich rozwiązań jak Flutter czy React Native?
  • w jaki sposób i z jakich źródeł uczyć się Qt?
  • jak wygląda rynek pracy związany z tym frameworkiem?

Subskrypcja podcastu:

Linki:

Wsparcie na Patronite:

Wierzę, że dobro wraca i że zawsze znajdą się osoby w bliższym lub dalszym gronie, którym przydaje się to co robię i które zechcą mnie wesprzeć w misji poszerzania horyzontów ludzi z branży IT.

Patronite to tak platforma, na której możesz wspierać twórców internetowych w ich działalności. Mnie możesz wesprzeć kwotą już od 5 zł miesięcznie. Chciałbym oddelegować kilka rzeczy, które wykonuję przy każdym podcaście a zaoszczędzony czas wykorzystać na przygotowanie jeszcze lepszych treści dla Ciebie. Sam jestem patronem kilku twórców internetowych i widzę, że taka pomoc daje dużą satysfakcję obu stronom.

👉Mój profil znajdziesz pod adresem: patronite.pl/porozmawiajmyoit

Pozostańmy w kontakcie:

 

Muzyka użyta w podcaście: „Endless Inspiration” Alex Stoner (posłuchaj)

Transkrypcja podcastu

To jest 185. odcinek podcastu Porozmawiajmy o IT, w którym z moim gościem rozmawiam o frameworku Qt. Przypominam, że w poprzednim odcinku rozmawiałem o budowie i wdrożeniach SAP. Wszystkie linki oraz transkrypcję dzisiejszej rozmowy znajdziesz pod adresemporozmawiajmyoit.pl/185

Ocena lub recenzja podcastu w Twojej aplikacji jest bardzo cenna, więc nie zapomnij poświęcić na to kilku minut. Od niedawna można wystawiać oceny podcastom w Spotify. Będzie mi bardzo miło, jeśli w ten sposób odwdzięczysz się za treści, które dla Ciebie tworzę. Dziękuję.

Zastanawiasz się nad zmianą pracy, ale gdy przeglądasz oferty na popularnych stronach, to nie jesteś przekonany, czy młody, dynamiczny zespół oraz owocowe środy są dla Ciebie? Na szczęście jest solid.jobs – portal z ofertami pracy dla ludzi, którzy chcą wiedzieć, ile będą zarabiać, z jakimi technologiami i nad jakim projektem będą pracować. Solidne oferty pracy znajdziesz na solid.jobs.

Ja się nazywam Krzysztof Kempiński, a moją misją jest poszerzanie horyzontów ludzi z branży IT. Środkiem do tego jest między innymi ten podcast. Wspierając mnie przez Patronite, dzieląc się tym odcinkiem w swoich kręgach lub feedbackiem na jego temat ze mną, pomagasz w realizacji tej misji. A teraz życzę Ci już miłego słuchania!

Odpalamy!

 

Cześć!

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ą.

 

Myślę, że jest wiele nowoczesnych zastosowań czy miejsc, które powstały stosunkowo niedawno, w których Qt się odnajduje, ale chciałbym na chwilkę wrócić do tych pierwotnych zastosowań związanych z interfejsem użytkownika. Bo jak po części już wspomniałeś, przy frameworku Qt narodził się język QML, który jest wykorzystywany głównie do programowania interfejsu użytkownika. 

Opowiedz może chwilkę o języku QML. Do czego się go wykorzystuje?

 

Zanim to zrobię, mogę opowiedzieć jedną anegdotę? Bo mi się przypomniała odnośnie do tego wykorzystywania Qt-a.

 

No pewnie.

 

Wspominałem o tej różnorodności projektu, to jest naprawdę bardzo fajne, bo oczywiście, mam znajomych, którzy sobie projektują w innych technologiach, tworzą jakieś aplikacje mobilne, webowe i zawsze wyczuwam w nich taką zazdrość, gdy pokazuję zdjęcia lub opowiadam, że u ans w biurze stoi akurat jakaś kierownica, którą dostaliśmy od klienta, i musimy ją zintegrować z jakimś innym komponentem, napisać do niej jakąś aplikację z GUI, coś tego typu.

Kiedyś mieliśmy taki case, że w tym samym momencie jeden zespół pracował nad czymś naprawdę awangardowym, to był interfejs użytkownika do drukarki 3D, która drukowała z żywej tkanki i docelowo jest planowane drukowanie na niej np. ucha albo skórę, albo inne organy. I w tym samym czasie mieliśmy zespół, który pracował nad zupełnie innym projektem, innego kalibru, mianowicie nad interfejsem do krajalnicy do mięsa.

 

Ta różnorodność może być oczywiście ciekawa, z pewnością nie doświadczysz tego w standardowych projektach webowych, gdzie robisz tylko Api do czegoś tam, do frontendów. Dla niektórych to może być całkiem fajne oderwanie i różnorodność. Do rynku pracy chciałbym wrócić jeszcze na koniec, a teraz, trzymając się bardziej technicznych aspektów, to zaczęliśmy o języku QML, więc czym on jest?

 

Jeżeli chodzi o QML-a, to jest to deklaratywny język programowania, tzn. jeżeli wierzyć deklaracjom z Wikipedii, co to jest deklaratywny język programowania, paradygmat, to możemy powiedzieć, że staramy się opisać efekt, który chcemy osiągnąć, a nie sposób, w jaki chcemy to osiągnąć.

Sam QML przypomina swoją składnią taki mix Jasona, Java Scriiptu i CSS-a. Sama składnia jest dosyć wygodna w obsłudze. QML ma to do siebie, że dosyc szybko rośnie, dosyć szybko się rozszerza, więc o ile bardzo łatwo wejść w QML-a, o tyle potrzeba trochę skilla i czasu, aby być mistrzem.

 

Używa się go do programowania UI, tak?

 

Tak, zdecydowanie, do user interfejsów, do interfejsów użytkownika. Tam też obecnych jest wiele konceptów, które są obecne w samym Qt, jak np. sygnały i sloty. I jest taki system Propetries. To jest taki dosyć wygodny koncept, który pozwala na tworzenie połączeń między właściwościami jednego obiektu, a drugiego, tzn. np. jednemu obiektowi zmienia się kolor, to drugiemu zmienia się w tym samym czasie bez potrzeby pilnowania tego.

QML-a można dosyć swobodnie mieszać z C++. I to jest też bardzo ciekawa opcja, bo powiedzmy sobie, że mamy aplikację w QML-u. Tak na dobrą sprawę, to zespół odpowiedzialny za Qt udostępnił wiele narzędzi obecnych w samym Qt do QML-a, więc do pewnego stopnia można pisać aplikację mobilną tylko i wyłącznie z wykorzystaniem QML-a. 

Powiedzmy, że mamy taką aplikację, która gada z jakimś CRUD-em i wyświetla nam informacje – coś takiego można na luzie napisać tylko i wyłącznie w QML-u, bez potrzeby angażowania w to C++. Ale dobrą praktyką jest mimo wszystko separacja logiki biznesowej i UI. Z tego względu np. ja za każdym razem, gdy robię aplikację, to jak tylko jest coś, co się wpisuje w taką szeroką definicję logiki biznesowej, to piszę to w C++, a jeśli chodzi o UI, to tam pozostawiam rysowanie wszystkich obiektów, reakcje na działanie, animacje, tego typu rzeczy.

I to naprawdę działa w bardzo przemyślany sposób. Jeśli chodzi o najnowsze wersje Qt-a, w Qt 6 rejestrowanie typu, klasy w C++ jako typ w QML, który można wykorzystywać w QML-u dosłownie tak, jak każdy inny typ w QML-u, jest banalnie proste. Można tak naprawdę podzielić zespół na tych, którzy lepiej się odnajdują w QML-u i na tych, którzy lepiej się odnajdują w C++ i ci od QML-a będą mieli wygodne, znane im Api, znaną im składnię do operowania na de facto obiektach C++.

Może jeszcze w tym kontekście powiem, że robi się tak nie tylko z uwagi na tę separację, ale często jest też tak, że trzeba aplikację z czymś zintegrować. To może być jakaś zewnętrzna zależność albo jakaś funkcjonalność Qt-a, która nie jest obecna w QML-u, albo coś w C, albo może trzeba uruchomić jakiś skrypt, a być może też Qt udostępnia taką możliwość, że uruchamiamy kod w Javie, np. jak mamy coś natywnego do uzyskania na Androidzie albo w Objective-See, jeżeli mowa o Macu lub IOS-ie. I również w takich sytuacjach pisze się to w C++, komunikuje się z tą warstwą natywną i wywołuje z QML-a.

 

Właśnie, wiele razy podkreślałeś tutaj tę cross platformowość i możliwość połączenia z innymi zastosowaniami, technologiami, bibliotekami itd. Myślę, że to jest gdzieś tam w DNA Qt, żeby właśnie w taki cross platformowy sposób działać.

Wspomniałeś też o tym, że rozwiązania mobilne to obszar, w którym ten framework może znaleźć zastosowanie. Jak byś to porównał do bardziej popularnych rozwiązań typu Flutter czy React Native?

 

Swoją drogą popełniłem taki wpis na bloga, w którym porównywałem właśnie Fluttera, React Native i Qt-a i w ramach pracy nad tym napisałem proste aplikacje w tych wszystkich technologiach i zrobiłem szybkiego benchmarka. Moje zdanie jest takie, że oba te frameworki (React Native i Flutter) wygrywają, jeśli chodzi o popularność, i to jest ważna rzecz, bo dzięki temu łatwiej znajdzie się wsparcie do projektu, poszukiwaną informację, być może próg wejścia jest łatwiejszy, bo jest więcej tutoriali, społeczność jest żywsza. I one zdecydowanie wygrywają, jeżeli chodzi o ten aspekt.

Jeżeli chodzi o samo wsparcie dla mobilek, to gdybym miał zerową wiedzę na temat wszystkich tych trzech frameworków i miałbym do napisania aplikację, która będzie tylko i wyłącznie mobilna, to zdecydowanie wybrałbym albo React Native, albo Fluttera, z uwagi na to, że one mimo wszystko skupiają się na tych rozwiązaniach mobilnych. I siłą rzeczy, jeżeli oni się focusują na czymś, to najprawdopodobniej będą w tym lepsi. Qt mimo wszystko pracuje na wielu obszarach, ma znacznie szerszą paletę zastosowań, ale mimo to dosyć wygodnie tworzy się w nim aplikacje na mobilki. 

Ja bardzo sobie cenię możliwość prostej integracji pomiędzy kodem w Qt, a kodem w Javie na Androida albo w Objective-See, bo czasami tak jest, że trzeba napisać coś natywnego. Ale jeżeli chodzi o szersze zastosowanie, np. teraz Flutter aspiruje także do desktopów albo ostatnimi czasy również próbuje coś robić, jeżeli chodzi o urządzenia wbudowane. I tutaj wydaje mi się, że takim zdecydowanym czynnikiem na korzyść Qt-a jest to, że on jest dojrzały, jeżeli chodzi o to.

Ja zawsze jestem zwolennikiem teorii, że powinno się wybierać nudne rozwiązania, tzn. takie, które są już na rynku od dawna, nieeksperymentalne. Dla przykładu tylko powiem, że Flutter jest oficjalnie wspierany na desktopach, ale już np. najważniejsza z punktu widzenia Fluttera zależność, czyli Firebase, do niedawna (nie wiem, jak jest teraz, bo nie sprawdzałem) nie był dostępny na Windowsie. A mimo wszystko Flutter jako sam framework jest dosyć mały, jego człon funkcjonalności jest dosyć mały i ludzie opierają się na zależnościach. 

I to staje się problemem w momencie, gdy chcemy dodać platformę i mamy taką zależność, która jest rozwijana przez kogoś z zewnątrz i on nie zapewnił wsparcia dla tej platformy. Mamy wtedy wybór albo kontrybuować do tej paczki, albo znaleźć inne rozwiązanie; pojawiają się takie problemy. A z uwagi na to, że Qt ma wiele modułów, to możemy liczyć na to, że dodawanie kolejnej platformy, kolejnej funkcjonalności przyjdzie nam łatwiej.

Ale przy tym wszystkim ja w dalszym ciągu jestem zwolennikiem teorii, że powinno się wybierać takie rozwiązania nudne lub takie, które się zna, tzn. jeżeli mamy zespół, który robił aplikacje desktopowe w Qt, w C++, macie do zrobienia aplikację mobilną do zrobienia, śmiało możecie zrobić wszystko w Qt.

 

Jeżeli chodzi o samo wsparcie dla mobilek, to gdybym miał zerową wiedzę na temat wszystkich tych trzech frameworków i miałbym do napisania aplikację, która będzie tylko i wyłącznie mobilna, to zdecydowanie wybrałbym albo React Native, albo Fluttera, z uwagi na to, że one mimo wszystko skupiają się na tych rozwiązaniach mobilnych. I siłą rzeczy, jeżeli oni się focusują na czymś, to najprawdopodobniej będą w tym lepsi. Qt mimo wszystko pracuje na wielu obszarach, ma znacznie szerszą paletę zastosowań, ale mimo to dosyć wygodnie tworzy się w nim aplikacje na mobilki. 

 

To skoro jesteśmy już w wątku doboru odpowiednich rozwiązań do danego problemu, to chciałbym Cię zapytać, czy na bazie doświadczeń z wcześniejszych projektów jesteś w stanie stwierdzić, kiedy Qt będzie dobrym rozwiązaniem w danym projekcie, a kiedy może lepiej darować sobie i wybrać inne rozwiązanie?

 

Idąc tym tropem, w dużej mierze będzie to zależało od samego projektu i od palety platform, które planujemy wspierać. I od naszego budżetu. I od czasu, który mamy. W przypadku Qt-a najkorzystniej działa zdecydowanie ta szeroka cross platformowość. I ja nie znam innego frameworka, który wspiera tyle platform na raz. 

Bo poza tym wsparciem dla mobilek, dla desktopów, to są systemy wbudowane, tzw. real-tme operation systems, są mikrokontrolery i szereg platform sprzętowych, które Qt wspiera. I nie ma drugiego takiego frameworka, który wspierałby tyle platform. Ale pytanie, czy my w ogóle potrzebujemy? Co nas to obchodzi, że Qt-a da się uruchomić na jakimś mikrokontrolerze? Równie dobrze możemy mieć budżet i czas na to, żeby natywnie rozwijać aplikację na IOS-a i Androida, bo to są dwie jedyne platformy, których potrzebujemy.

Ponownie taką swoją poradę bym krótko podsumował tym, aby wybierać takie rozwiązania, które się zna. Ale gdybyśmy już wchodzili w detale, tzn. powiedzmy, że chcemy zrobić aplikację desktopową, to ja niezależnie od tego, czy to byłaby natywna aplikacja, czy cross platformowa, wybrałbym Qt-a. Między innymi z uwagi na to, że powiedzmy, że mamy aplikację do zrobienia na Windowsa, rozwijamy tę aplikację, rozwijamy, rozwijamy, jak dodajemy jakieś zależności, to robimy to w C++, i powiedzmy, że w pewnym momencie przychodzi do nas wymaganie, aby dodać wsparcie na Maca. Wtedy trochę pracy i mamy aplikację przeportowaną na Maca.

Więc jeżeli chodzi o desktopy, to niezależnie od tego, czy idziemy cross platformowo od razu, czy tylko natywnie na daną platformę, to od razu wybrałbym Qt-a. Jeżeli chodzi o systemy wbudowane, to tutaj też bardzo wiele zależy od wymagań samego projektu, bo czasami np. w automotive coś się robi z wykorzystaniem, już nie pamiętam, albo Unreala, albo Unity, bo być może mają lepsze wsparcie dla 3D. Czasami miesza się jedno i drugie. 

Tak że dobrze jest spojrzeć na wymagania projektu, na zależności. Przykładowo w branży medycznej Qt też jest dosyć często wybierany z uwagi na to, że jak już są jakieś zależności, to one są właśnie w C++ albo w C. Albo wiele bibliotek do 3D albo do procesowania obrazów, jak OpenCV, Open CL, VTK i różne tego typu rozwiązania również są w C++ i prosto je wówczas integrować z aplikacją w Qt.

 

Dla tych osób, które chciałyby się zagłębić w ten świat, nauczyć się tego frameworka, to co byś polecił? Może jakieś źródła wiedzy, nauki dotyczące Qt? 

I takie pytanie towarzyszące, które się tutaj z pewnością pojawi: czy trzeba mieć C++ w małym paluszku, żeby w ogóle do tej nauki Qt podejść?

 

Odpowiadając na pierwsze pytanie, pozwolę sobie jeszcze na taką dygresję, że muszę przyznać, że np. React czy Flutter mają jakieś takie przyjaźniejsze doświadczenie użytkownika czy programistów w tym przypadku przy takim pierwszym kontakcie z tymi frameworkami. Prowadzą Cię za rączkę itd., jest spora społeczność, dużo tutoriali. Jeżeli chodzi o Qt-a, to też jest łatwo go znaleźć, pobrać, ale Qt ma również płatną licencję – o tym jeszcze do tej pory nie powiedziałem – i oni dosyć agresywnie próbują ją wcisnąć swoim użytkownikom. 

To wynika z prostego faktu: np. taki Google, który jest odpowiedzialny za Fluttera, zarabia na usługach – na sprzedaży swojej chmury, na Api do Google Maps. Oni zarabiają w ten sposób. A Qt zarabia na licencjach, stąd wynika różnica. Ale mimo wszystko prawie cały framework Qt jest dostępny do wykorzystania w projektach komercyjnych za darmo. Tylko że mimo wszystko, jak się wejdzie na stronę i kliknie się 'download’, to pierwszy button do pobrania to pewnie będzie jakieś 'buy’ albo 'try free for 30 days’ i trzeba zeskrollować pół obrotu kółkiem myszki niżej, aby kliknąć 'go opencource’. 

Ale już jeżeli chodzi o materiały do nauki, to tutaj też jest pełno kursów na Udemy, kilka na YouTube. Sam Qt pracuje częściowo przy współpracy ze mną na Centrum Edukacyjnym, gdzie właśnie będą znajdowały się materiały wideo, kursy dotyczące tego, jak zacząć, u mnie w firmie też będziemy pracować nad własnym, darmowym kursem na YouTube, który planujemy wypuścić pod koniec kwartału, tak że będzie pokrywał taką esencję tego frameworka. Więc warto mnie śledzić, bo pewnie wrzucę jakieś info o tym. 

Ale tak jak w przypadku każdej technologii, można sobie oglądać tutoriale, ale trzeba kodować, prawda?

 

W praktyce, jasne.

 

Odpowiadając na Twoje drugie pytanie, to uważam, że nie, że nie trzeba mieć C++ w małym paluszku, aby zacząć z Qt-em. Powiedziałbym nawet, że znam ludzi, którzy zaczynali z Qt-em bez znajomości C++. I co prawda z czasem wychodziło tak, że jakiś aspekt zarządzenia pamięcią był im obcy i coś się wykrzaczało, ale to nie jest nic, co nie zostanie złapane w review, to nie jest nic, co nie wyjdzie, nic, czego nie dałoby się wygooglować. Nowoczesny C++ de facto w połączeniu z Qt-em w moim odczuciu jest bardzo przyjaznym dla programisty językiem.

 

Okej, Łukasz, myślę, że fajnie tutaj powiedziałeś o historii, zastosowaniach, budowie tego frameworka, zastosowaniach takich cross platformowych, co jest bardzo mocną stroną Qt, powiedziałeś też o sposobie nauki, myślę, że żeby dopełnić jeszcze obrazu, to trzeba opowiedzieć, jak wygląda rynek pracy. Czy w ofertach pracy pojawia się taki wymóg jak framework Qt? Powiedz, jak to widzisz jako osoba zatrudniająca.

 

Jeżeli chodzi o C++, to ja absolutnie widzę szereg ofert, widełki są naprawdę fajne i nie ma co się dziwić, tym bardziej że wiele starszych projektów zostaje przeniesiona na C++. Albo C++ jest też wykorzystywany w jakichś takich bardziej niszowych, bardziej technicznych, specyficznych rozwiązaniach – i takich ekspertów też często potrzebują, że jest tam C++, ale dobrze, jakbyś do tego się znał na procesowaniu dźwięku przykładowo.

Qt też bardzo często się pojawia w wymaganiach. Bo nie tylko, że jesteś w C++ deweloperem, ale fajnie, gdybyś znał też Qt-a, bo czasami robimy coś w tym narzędziu, ale też pojawiają się oferty stricte na Qt albo QML Deweloperów.

My właśnie, jak rekrutujemy, to do pewnego momentu rekrutowaliśmy w ten sposób, że docelowo szukaliśmy Qt-owców, ale po czasie zrozumieliśmy, że dosyć szybko programista C++ jest w stanie dorzucić do swojego skillsetu Qt-a, i takich teraz zatrudniamy. Tak że, jeżeli chodzi o rynek pracy, to jest dobrze.

 

Myślę, że tym optymistycznym akcentem będziemy zamykać naszą rozmowę. Łukasz Kosiński z firmy Scythe Studio był moim gościem, rozmawialiśmy o frameworku Qt. Łukasz, bardzo Ci dziękuję za podzielenie się wiedzą, za Twój czas.

 

Ja również dziękuję, Krzysiek, za to, że mnie zaprosiłeś. I chciałbym wszystkich zachęcić do tego, aby dali Qt-owi szansę i być może więcej poczytali.

 

Właśnie, dla tych osób, może, Łukasz, powiedz jeszcze, gdzie Cię można znaleźć w internecie albo gdzie możemy odesłać osoby zainteresowane poszerzaniem swojej wiedzy, ale też może zainteresowanych ofertami pracy.

 

Jeżeli chodzi o polskie materiały, to mam blog po polsku binarniepl – przyznam szczerze, że prowadzę go z różną częstotliwością, nie jestem systematyczny, ale jeżeli chcecie poczytać trochę o Qt, to tam znajdziecie wpisy o nim. Na stronie mojej firmy https://scythe-studio.com/ również znajdziecie sporo o samym Qt, przede wszystkim na blogu. I jeżeli tylko coś się dzieje, jeżeli chodzi o jakieś takie nasze akcje w kierunku polskiej sceny Qt-a, to wrzucamy info, czy to na naszym firmowym LinkedInie, czy ja na swoim dosyć aktywnie działam, więc możecie tam zaglądać.

Jeżeli mogę, to się pochwalę, że zostałem wybrany na Qt Championa za 2022 rok. To jest taki tytuł, który inni Qt Championi dają osobom, które jakoś się wyróżniają. Ja np. dostałem w kategorii Ambasador, tzn., że po prostu reklamuję Qt-a. Ja słowo daję, że mi za to nie płacą, tak że to po prostu wynika ze szczerego entuzjazmu i mojej sympatii do tego narzędzia.

 

Myślę, że w tej rozmowie doskonale kontynuujesz tę misję, tak że też oczywiście Ci gratuluję tego tytułu. Te linki, o których powiedziałeś, zawrę oczywiście w notatce do odcinka, żeby łatwiej było sobie trafić.

Jeszcze raz bardzo Ci dziękuję za poświęcony czas.

Do usłyszenia! Cześć!

 

Do usłyszenia i wielkie dzięki jeszcze raz.

 

I to na tyle z tego, co przygotowałem dla Ciebie na dzisiaj. Po więcej wartościowych treści zapraszam Cię do wcześniejszych odcinków. A już teraz, zgodnie z tym, co czujesz, wystaw ocenę, recenzję lub komentarz w aplikacji, w której słuchasz lub w social mediach. 

Zawsze możesz się ze mną skontaktować pod adresem krzysztof@porozmawiajmyoit.pl lub przez media społecznościowe. 

Ja się nazywam Krzysztof Kempiński, a to był odcinek podcastu Porozmawiajmy o IT o frameworku Qt. Zapraszam do kolejnego odcinka już wkrótce.

Cześć!

 

+ Pokaż całą transkrypcję
– Schowaj transkrypcję
Tags:
,
mm
Krzysztof Kempiński
krzysztof@porozmawiajmyoit.pl

Jestem ekspertem w branży IT, w której działam od 2005 roku. Zawodowo zajmuję się web-developmentem i zarządzaniem działami IT. Dodatkowo prowadzę podcast, kanał na YouTube i blog programistyczny. Moją misją jest inspirowanie ludzi do poszerzania swoich horyzontów poprzez publikowanie wywiadów o trendach, technologiach i zjawiskach występujących w IT.