====== Project structure ======
There are two views you can take toward how Qt projects are structured: the file view and the workflow view. Depending on how your brain works and/or the issue you are trying to understand, one of these will work better than the other. In all probability, both will be useful at some point.
===== The file view =====
A Qt project is a collection of project description files, source code files, resource files, and binary output files. Some of these files must be explicitly generated using a text editor or similar tool, others are automatically generated by the build process.((The explicit/automatic dichotomy holds true whether you are using an IDE or a simple command line based environment. However, an IDE will typically manage the explicit generation of may of the files for you (e.g., *.pro files).))
==== Project description files ====
=== Explicitly generated ===
* **''{directory-name}.pro''**
* The [[qt:pro_files|Qt project description file]].
* Created by running qmake -project
* May require hand editing (e.g. to add/remove source files, specify whether debug and/or release build should be available, etc.).
=== Automatically generated ===
* **''Makefile''**, **''Makefile.debug''**, and **''Makefile.release''**
* Standard files for use by ''make'' (Linux and OS X) or ''nmake'' (Windows) to do the actual project build.
* Automatically generated when you run qmake
==== Source files ====
=== Explicitly generated ===
* **''main.cpp''**
* The project's main C++ file containing the ''main'' function.
* The name of this file is a convention, not a requirement.
* **''{yourclass}.h''** and **''{yourclass}.cpp''**
* C++ class header and implementation files for a class that you derived from QObject (if needed).
* Probably contains ''Q_OBJECT'', a Qt macro used to implement signals and slots.
* There may be more than one of these.
* **''{yourdialog}.ui''**
* A description of a Qt GUI.
* Typically created using Qt Designer.
=== Automatically generated ===
* **''moc_{yourclass}.cpp''**
* Implementation file corresponding to ''YourClass'' after the ''Q_OBJECT'' macro has been fully expanded and other QObject foo is resolved.
* In other words, this is pure C++.
* Automatically generated by ''[[moc]]'' (the //meta-object compiler//), which is itself automatically configured in the Makefile by ''[[qmake]]''.
* **''ui_{yourdialog}.:?:''** FIXME
* C++ :?: file based on ''{yourdialog}.ui''.
* Automatically generated by ''[[uic]]'' (the //user interface compiler//), which is itself automatically configured in the Makefile by ''[[qmake]]''.
==== Resources ====
=== Explicitly generated ===
* **''{resources}.qrc''**
* A Qt [[http://doc.qt.nokia.com/stable/resources.html|resource collection file]] specifying the location of icons and other resources for your project.
* You can have more than one of these.
* Automatically processed by ''[[rcc]]'' (the Qt resources compiler) if mentioned in [[pro files|{directory-name}.pro]].
=== Automatically generated ===
* **''qrc_{resources}.cpp''**
* cpp file that contains data for the resources mentioned in ''{resources}.qrc'' as static C++ arrays of compressed binary data.
* Automatically generated and linked to the project when [[qmake]] is run (assuming it's mentioned in the *.pro file).
==== Binary output ====
* Compiled binaries will end up in ''{directory-name}''.
* If ''[[pro files|{directory-name}.pro]]'' has been configured for both release and debug, then object files will be ''{directory-name}/release'' or ''{directory-name}/debug'' depending on how you invoked ''make'' (or ''nmake''). Otherwise, object files will also be in ''{directory-name}''.
===== The workflow view =====
The typical Qt project workflow consists of the following major phases: creating a project, adding files to a project, building and testing a project. These are discussed below.((These phases hold true whether you are using a IDE or a simple command line based environment. However, an IDE will typically manage many of these tasks for you.))
==== Creating a project ====
- Create a new directory to contain your project that carries the name of your project.
- Create a main.cpp file in that directory that contains some skeleton code (e.g., [[HelloWorld]]).
- Execute qmake -project
in a terminal shell in the project directory. This will generate a ''[[pro files|{directory-name}.pro]]'' project description file.
* Notes:
* If any *.cpp or *.h files already exist in the directory when you run ''qmake -project'', they will be included in the generated ''[[pro files|{directory-name}.pro]]''. Having a main.cpp before you run ''qmake -project'' will make the resulting *.pro file much easier to work with.
* You should probably run ''qmake -project'' only once during the life of a project. After the *.pro file's initial generation, you will need to edit it manually to add/remove files from the project (see the next section).
==== Adding files ====
- Create the desired *.h, *.cpp, *.ui, and *.qrc source files in the project directory and edit to your heart's content.
- Edit ''[[pro files|{directory-name}.pro]]'' to reflect the added files.
- Run qmake
to generate a new Makefile, ''debug'' and ''release'' sub-directories (if needed), and and other support files.
Notes:
* Repeat the above as needed.
* Whenever you add new files, be sure to reflect those changes into the *.pro file and rerun ''qmake'' before running building and testing.
* Assuming {directory-name}.pro is correctly configured, the Makefile generated by ''[[qmake]]'' will automagically be configured to call [[moc]] and [[uic]] as needed.
==== Building and testing ====
- If you did //not// configure the ''[[pro files|{directory-name}.pro]]'' file to build both release and debug versions, build the project by executing make
in the project directory. If you //did// specify release and/or debug builds in ''[[pro files|{directory-name}.pro]]'', then run make release
or make debug
depending on what you want.
- Launch your application by executing ./{directory-name}
in the project directory (or use your file manager to launch the executable, or load the executable into a debugger or ...).
Notes:
* If you want to remove all intermediate files that the compiler generated (e.g., object files), run make clean