Lerning Qt

When a software product is developed, not only the product is the outcome, but sometimes many tools, which support the development process. I work as an embedded software developer. In my work many times I faced situations, that I do the same operation or set of operations repeatedly. When there is opportunity, I try to automate. Of course, if there is time to automate, because sometimes it’s not so obvious what or how to automate. Many times I create small command line tools, which usage is known only to me. When working with other developers it’s better to share these tools, but not always command line is the best. When developing helper tools, it’s better to have a GUI. A developer just selects what he or she wants and does not have to think about what command and following option should be typed.

My weapon of choice is Qt library. Why Qt? Qt is portable, is very rich when it comes to various components, if the developed tool will be free, the library is also free. The library provides a layer of abstraction, it abstracts the underlying operating system’s functions and hardware. Building Qt application is very easy with Qt Creator, Qt’s IDE with very strong C++ awareness and a graphical UI designer, the GUI can be quick created and the logic, which will drive the GUI’s operations is written in C++.

I want to learn programming with Qt and C++, because I want to make standalone tools, which can be loaded on a USB memory. Qt applications can be deployed as normal, which use shared Qt libraries, installed separately in the OS or they can be deployed as standalone applications. Of course, the only thing is that a Qt application is compiled for a given target OS. If another target OS should be support, the application has to be rebuild for that OS.

Learning resources:

  • Book: C++ GUI Programming with Qt 4, Second Edition by Jasmin Blanchette; Mark Summerfield
  • Book: Advanced Qt Programming, Creating Great Software with C++ and Qt 4 by Mark Summerfield
  • C++ Qt Programming video tutorials by VoidRealms
  • And of course examples from Qt Creator

First book is very simple, goes from basic, through intermediate to advanced topics. Second book explains on the topics more deeply. Exploring Qt Creator’s examples is very easy, on the welcoming screen is a tab with examples – Demos and Examples.

I was previously trying to tackle the topic of learning Qt using the first book, but I couldn’t get it how some things should be made in Qt Creator. I prefer some live example, so the video tutorials by VoidRealms are just great. He does all the examples in Qt Creator, so it is easier to get familiar with this IDE.

Programowanie Qt: organizacja projektu

Ostatnio trochę zacząłem się uczyć programowania w Qt. Czasami wiedza za zakresu programowania GUI w jakimś frameworku jest potrzebna, szczególnie jeżeli potrzeba nam stworzyć jakiś tool wspomagający nasze prace programistyczne. Nie chodzi mi tutaj o narzędzia parsujące, ale na przykład narzędzia do analizy logów. Lepiej jest analizować logi, szczególnie jeżeli jest ich bardzo dużo i są one z dużej ilości modułów, jak jest możliwość kolorowania i zaznaczania poszczególnych wpisów.

Zacząłem czytać różne tutoriale i strony z przykładami, szczególnie przydatna oczywiście jest dokumentacja Qt, gdzie można znaleźć sporo przykładów wykorzystania klas.

Pisząc proste przykłady mamy niewiele plików i projekty nie są skomplikowane. Qt SDK dostarcza nam narzędzia Qt Creator, które organizuje projekt w poszczególne foldery i generuje odpowiednie pliku konfiguracyjne. Ale co zrobić w przypadku, gdy nie chcemy korzystać z Qt Creatora? Należy napisać własny plik *.pro.

Całość okazuje się dość prosta za sprawą narzędzia ‘qmake’. Na początek ustalamy podstawową strukturę katalogów. Ja w swoim przykładowym projekcie zrobiłem tak:

projekt
  |-build
     |-moc_files
     |-obj
     |-rcc_files
     |-ui_files
  |-inc
  |-rs
  |-src
  |-ui

Teraz tworzymy pliki projektu. Nagłówki w ‘inc’, pliki źródłowe w ‘src’, zasoby takie, jak obrazki w ‘rs’, pliki interfesju w ‘ui’. W katalogu głównym ‘projekt’ tworzymy plik ‘projekt.pro’, który ma zawartość:

TEMPLATE = app
TARGET =
DEPENDPATH += . inc src ui
INCLUDEPATH += . inc
DESTDIR = build           # trzeba dopisać
RCC_DIR = build/rcc_files # trzeba dopisać
UI_DIR = build/ui_files   # trzeba dopisać
OBJECTS_DIR = build/obj   # trzeba dopisać
MOC_DIR = build/moc_files # trzeba dopisać

# Input
HEADERS += inc/mainwindow.h
FORMS += ui/mainwindow.ui
SOURCES += src/main.cpp src/mainwindow.cpp

Możemy najpierw wykonać komendę ‘qmake -project’, która nam wygeneruje podstawowy plik. Będziemy musieli uzupełnić tylko wpisy dotyczące miejsca, gdzie zostaną utworzone pliku kompilacji oraz wynikowe (komentarze powyżej). Będziemy mieli dzięki temu porządek w głównym katalogu, tylko plik pro i Makefile. Niestety, jeżeli dodamy coś do projektu, na przykład dodatkowy plik interfejsu w katalogu ‘ui’, to przegenerowanie pliku projektu komendą ‘qmake -project’ usunie nam dodane wpisy. Więc warto sobie wcześniej skopiować stary plik albo mieć gdzieś te wpisy na boku i dodawać za każdym razem.

Jak mamy gotowe już pliki konfiguracyjne i projektowe to wykonujemy ‘qmake projekt.pro’, wygenerowany zostanie odpowiedni Makefile. Wpisujemy ‘make’ i aplikacja zostanie zbudowana, wszystkie pliki wykonywalne oraz kompilacji są w katalogu ‘build’, a drzewo projektu jest czyste i przejrzyste.