Podstawowe narzędzia Qt4 - qmake.

Wstęp

W poprzedniej części przedstawiłem mechanizm sygnałów i slotów, który bez wątpienia jest jedną z najlepszych cech Qt4. Zanim jednak na dobre przystąpimy do programowania, musimy zapoznać się z podstawowymi narzędziami Qt4, jak na przykład systemem budowania qmake, dzięki któremu będziemy mogli łatwo zarządzać naszymi projektami.



Plik projektu .pro

Qt posiada własny system budowania qmake, który na podstawie plików projektów potrafi wygenerować niezbędne pliki potrzebne do kompilacji na danej platformie, np. w przypadku Linuksa będą to pliki Makefile. Pliki projektów qmake posiadają rozszerzenie .pro, a ich składnia jest bardzo prosta i nikt nie powinien mieć problemów z jej zapamiętaniem. Najlepiej będzie, jeśli posłużymy się przykładem. Załóżmy, że nasz projekt składa się z pięciu plików z kodem źródłowym: PlikNaglowkowy1.h, PlikNaglowkowy2.h, Implementacja1.cpp, Implementacja1.cpp oraz main.cpp. Plik projektu dla nich będzie wyglądał następująco:


# Mój pierwszy projekt "aplikacja.pro".

TEMPLATE = app
TARGET = aplikacja.bin
CONFIG += qt
QT += gui network

HEADERS += PlikNaglowkowy1.h PlikNaglowkowy2.h
SOURCES += Implementacja1.cpp Implementacja2.cpp main.cpp

Jak możemy zobaczyć w pierwszej linijce, komentarze rozpoczynamy znakiem kratki. Komentarz obowiązuje aż do końca linii.



TEMPLATE = app

Słowo kluczowe TEMPLATE służy do wyboru szablonu projektu. Do wyboru mamy:


  • app - szablon dla aplikacji (domyślny)

  • lib - szablon dla biblioteki

  • subdirs - szablon dla projektu zawierającego podprojekty (każdy folder z podprojektem musi zawierać własny plik .pro)


Wybór szablonu jest bardzo ważny, ponieważ w przypadku gdybyśmy chcieli stworzyć bibliotekę, a jako szablon wybralibyśmy szablon dla aplikacji, to podczas kompilacji linker zgłosiłby błąd o braku funkcji main(), która nie występuje w bibliotece.


TARGET = aplikacja.bin



Słowo kluczowe TARGET określa nazwę wynikowego pliku binarnego, czyli w naszym przykładzie plik ze skompilowaną aplikacją będzie nosił nazwę aplikacja.bin. Jeśli podalibyśmy np. bin/aplikacja.bin, wtedy plik wynikowy zostałby utworzony w podfolderze bin




CONFIG += qt
QT += gui network



W tym miejscu określamy dodatkowe moduły biblioteki Qt4, z jakich korzysta nasza aplikacja, a co za tym idzie, z jakimi ma być zlinkowana. W powyższym przykładzie są to odpowiednio QtGui i QtNetwork. Linia CONFIG += qt jest niezbędna w projektach korzystających z Qt4.



Zwróćmy uwagę na operatory = i +=. Pierwszy z nich przypisuje nową wartość do danej zmiennej, drugi natomiast dodaje ją, nie usuwając starych wartości. Spójrzmy na przykład



QT += gui
QT += network


Jak widzimy, dzięki temu jedną instrujcję możemy rozłożyć na dwie oddzielne linie.



HEADERS += PlikNaglowkowy1.h PlikNaglowkowy2.h
SOURCES += Implementacja1.cpp Implementacja2.cpp main.cpp


HEADERS jako wartości przyjmuje nazwy plików nagłówkowych projektu, natomiast SOURCES nazwy plików z implementacją.



Istnieje oczywiście wiele więcej zmiennych dla plików projektów, jednakże nie są one często używane w małych projektach. Zainteresowanych odsyłam do dokumentacji Qt4 (W indeksie: qmake).


Instrukcje warunkowe w plikach projektów

Może zajść taka sytuacja, że dla systemu Mac OS X będziemy posiadali inny plik z implementacją, niż dla Windowsa, czy Linuksa. Z pomocą przychodzą bloki z instrukcjami warunkowymi, dzięki którym możemy zamieścić specjalne instrukcje dla poszczególnych platform.

Na przykład musimy zaimplementować klasę SuperKlasa, jednak implementacja dla systemu Linux będzie się znacznie różniła, niż dla Mac OS X i Windowsa. Tworzymy więc odpowiednie bloki w pliku projektu:


#Instrukcje dla platformy Windows:
win32 {
SOURCES += SuperKlasa_win32.cpp
}

#Instrukcje dla Mac OS X:
macx {
SOURCES += SuperKlasa_osx.cpp
}

#Instrukcje dla Linuksa:
linux* {
SOURCES += SuperKlasa_linux.cpp
}


W zależności od tego na której z platworm będzie budowany projekt, odpowiednie instrukcje zostaną wykonane.


Załóżmy inną sytuację - chcemy sprawdzić, czy w folderze z naszym projektem znajduje się plik main.cpp. W przypadku gdy go nie ma, zgłaszamy błąd. Do wykonania tych operacji posłużą nam funkcje exists() i error():


!exists( main.cpp ) {
error( "Nie odnaleziono wymaganego pliku main.cpp!" )
}


Jak łatwo się domyśleć, wykrzyknik (!) neguje wartość wyrażenia, czyli nasz blok zostanie wykonany, gdy funkcja exists() nie zwróci prawdy. Jeśli chcielibyśmy zgłosić tylko komunikat o braku pliku main.cpp i nie przerywać działania qmake, możemy zamiast funkcji error() użyć funkcję message(). Więcej funkcji zostało opisane w dokumentacji Qt4.


Ready, set, go!

Gdy mamy gotowy plik projektu i chcemy zbudować naszą aplikację, wystarczy w terminalu przejść do folderu zawierającego nasz projekt i wykonać polecenie qmake z pełną nazwą pliku projektu jako argument, np.:



qmake ./aplikacja.pro



Zależnie od platformy zostaną wygenerowane odpowiednie pliki niezbędne do kompilacji naszego programu. Np. na Linuksie zostaną wygenerowane odpowiednie pliki Makefile, dzięki czemu do szczęścia brakuje nam tylko wydanie polecenia make, które rozpocznie kompilację projektu.



Zakończenie

Dzisiaj przedstawiłem najbardziej podstawowe informacje potrzebne do samodzielnego zarządzania projektami. Jutro zajmiemy się mechanizmem tłumaczenia aplikacji, a w kolenjnej części nareszcie rozpoczniemy zabawę z QtCreatorem i już właściwym programowaniem ;)


1 komentarze:

Unknown pisze...
11 lutego 2009 12:56

jest:
PlikNaglowkowy1.h, PlikNaglowkowy2.h, Implementacja1.cpp, Implementacja1.cpp
powinno być:
PlikNaglowkowy1.h, PlikNaglowkowy2.h, Implementacja1.cpp, Implementacja2.cpp

Prześlij komentarz