Když vytvoříte nový projekt pro Qt Widget Aplikaci ve vývojovém prostředí Qt Creator, generuje se několik souborů, které jsou potřebné pro konstrukci a běh aplikace. Zde jsou základní soubory a složky, které mohou být vytvořeny:
Soubory kódu:
main.cpp:
Oobsahuje vstupní bod (main() funkci) aplikace, která inicializuje aplikaci a spouští hlavní okno.
mainwindow.ui:
XML soubor, který popisuje uživatelské rozhraní aplikace. Můžete ho upravit pomocí návrháře UI v Qt Creatoru.
mainwindow.cpp:
Obsahuje implementaci třídy MainWindow, která definuje chování hlavního okna aplikace.
mainwindow.h:
Hlavičkový soubor, který deklaruje třídu MainWindow.
Konfigurační soubory:
.pro (např. myapp.pro):
Projektový soubor Qt, který obsahuje informace o projektu, jako jsou použité zdrojové soubory, hlavičkové soubory, knihovny, Qt moduly a další nastavení.
#include <QtGui/QApplication>: Tento řádek vkládá hlavičkový soubor pro třídu QApplication, která je definována v modulu QtGui a je zodpovědná za správu aplikace a interakci s grafickým systémem.
#include "mainwindow.h": Tento řádek vkládá uživatelem definovaný hlavičkový soubor pro třídu MainWindow, což je třída, která bude definovat hlavní okno aplikace.
int main(int argc, char *argv[]): Toto je vstupní bod aplikace. Funkce main přijímá dva argumenty:
int argc: Počet argumentů předaných při spuštění aplikace.
char *argv[]: Pole ukazatelů na řetězce, které představují argumenty předané při spuštění aplikace.
QApplication a(argc, argv);: Vytváří instanci QApplication. Tato instance musí být vytvořena před jakýmikoli GUI prvky aplikace. argc a argv jsou předány konstruktoru a mohou být použity k předání argumentů z příkazové řádky do aplikace.
MainWindow w;: Vytváří instanci MainWindow, což je třída definovaná uživatelem pro hlavní okno aplikace. Třída MainWindow by měla být definována ve vašem souboru mainwindow.h a obvykle obsahuje metody pro inicializaci uživatelského rozhraní a reakci na uživatelské vstupy.
w.show();: Metoda show() je volána na instanci hlavního okna (w), aby se okno zobrazilo na obrazovce. V tomto bodě je okno viditelné, ale aplikační smyčka údálostí ještě nebyla spuštěna, takže aplikace nebude reagovat na uživatelské vstupy.
return a.exec();: Metoda exec() třídy QApplication spouští smyčku událostí aplikace. Smyčka bude běžet dokud nebude zavolána metoda exit() nebo dokud nebudou zavřena všechna hlavní okna. Smyčka událostí je nezbytná pro zpracování událostí, jako jsou kliknutí myši a stisky kláves, a také pro aktualizaci grafického rozhraní. Hodnota vrácená funkcí exec() je vrácena jako návratový kód aplikace.
mainwindow.h: Obvykle obsahuje deklarace funkcí, slotů a proměnných, které budete ve třídě MainWindow používat.
ui_mainwindow.h: Tento soubor je automaticky generován nástrojem uic (Qt User Interface Compiler) a obsahuje deklarace všech GUI prvků, které jste přidali do hlavního okna v designéru formuláře.
Řádky 4–6
Tento úsek kódu definuje konstruktor třídy MainWindow. Konstruktor je speciální metoda, která je volána, když je vytvořena instance třídy. V tomto případě má konstruktor jeden parametr - parent, který je ukazatelem na nadřazený widget (ve většině případů může být nullptr, pokud MainWindow nemá nadřazený widget).
: QMainWindow(parent): Volání konstruktoru rodičovské třídy QMainWindow s parent jako parametrem.
, ui(new Ui::MainWindow): Následně je vytvořena nová instance Ui::MainWindow a ukazatel na ni je přiřazen členské proměnné ui.
Řádky 7–9
Nyní jsme v těle konstruktoru. Metoda setupUi() je definována v souboru ui_mainwindow.h a je volána, aby nastavila uživatelské rozhraní pro MainWindow. Parametr this odkazuje na instanci MainWindow, ve které bude uživatelské rozhraní nastaveno.
Řádky 11–14
Nakonec máme destruktor MainWindow. Destruktor je speciální metoda, která je volána, když je objekt (v tomto případě MainWindow) zničen, buď kvůli ukončení programu, nebo kvůli tomu, že je uvolněn ze paměti pomocí operátoru delete. V tomto případě destruktor odstraní objekt ui, aby uvolnil paměť. Toto je důležité, protože new Ui::MainWindow alokovala paměť na haldě, kterou je třeba ručně uvolnit.
Řádky 1–2
Tyto dva řádky definují preprocesorové direktivy, které brání dvojitému vkládání hlavičkového souboru. Když je hlavičkový soubor vložen, je MAINWINDOW_H definováno. Pokud se kód pokusí znovu vložit tento hlavičkový soubor, podmínka #ifndef MAINWINDOW_H nebude splněna a soubor nebude znovu vložen, což předchází problémům, jako jsou dvojité definice.
#include <QMainWindow>: Tento řádek kódu vloží hlavičkový soubor pro třídu QMainWindow, která poskytuje hlavní okno, které můžete v aplikaci používat.
Řádky 6–8
Tento kód definuje deklaraci třídy MainWindow ve jmenném prostoru Ui. Třída Ui::MainWindow je automaticky generována nástrojem UIC (User Interface Compiler) na základě .ui souboru, který vytváříte ve vizuálním designéru formuláře.
Řádky 10–20
Zde je deklarace třídy MainWindow, která je odvozena od QMainWindow. Makro Q_OBJECT je speciální makro od Qt, které musí být v soukromé části třídy, pokud chcete, aby vaše třída byla schopna používat mechanizmy Qt, jako jsou signály a sloty, nebo pokud chcete, aby váš objekt mohl být manipulován pomocí Qt Meta-Object systému (např. používán v Q_PROPERTY makru).
Dále je deklarován konstruktor a destruktor třídy MainWindow. Konstruktor má jeden parametr – parent, který je nastaven na nullptr jako výchozí hodnotu. Tento argument je typický pro většinu widgetů v Qt a slouží k určení nadřazeného widgetu (pro vícenásobné vnořené widgety/hlavní okna).
V soukromé sekci třídy deklarujeme ukazatel na instanci třídy Ui::MainWindow s názvem ui. Toto ui je používáno k interakci s widgety, které jste vytvořili v designéru formuláře.
Řádky 20–21
Zde třída MainWindow končí a direktiva #endif ukončuje preprocesorovou podmínku na začátku souboru, uzavírá ochranu proti dvojitému vkládání.