# Примеры проектов на Qt

<table><thead><tr><th width="234.79998779296875">Пример</th><th>Пояснение</th></tr></thead><tbody><tr><td><a href="https://4112636200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKMqUSFKgvT06FCJhm51b%2Fuploads%2Fgit-blob-88e11fb584cc064f425578e209d4b054221f97e1%2Fgraphics.7z?alt=media">OpenGL</a></td><td>Пример использования OpenGL для отрисовки в окне и обработки событий мыши.</td></tr><tr><td><a href="https://4112636200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKMqUSFKgvT06FCJhm51b%2Fuploads%2Fgit-blob-ca1ffc7228ca79640107338fc9f9c5a7d22fea67%2Fsignals.7z?alt=media">Сигналы и слоты</a></td><td>Иллюстрация системы сигналов и слотов.</td></tr><tr><td><a href="https://4112636200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKMqUSFKgvT06FCJhm51b%2Fuploads%2Fgit-blob-cb2044b3a92101fda20e218b5dda21c4cffd6a66%2Fsimple_calc.7z?alt=media">Простенький калькулятор</a></td><td>Пример небольшого приложения с графическим пользовательским интерфейсом, описанного кодом.</td></tr><tr><td><a href="https://4112636200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKMqUSFKgvT06FCJhm51b%2Fuploads%2Fgit-blob-d204e55fe6d15be83d93135640d01719e3d91368%2Fsettings.7z?alt=media">Widgets</a></td><td>Пример приложения с различными элементами пользовательского интерфейса.</td></tr></tbody></table>

## Пример организации проекта с несколькими конфигурациями <a href="#multi-config" id="multi-config"></a>

Возьмём следующий пример:

{% code overflow="wrap" lineNumbers="true" %}

```powershell
Mode   Name
----   ----
d----- include/         # заголовочные файлы проекта (API или интерфейс проекта)
d----- src/             # исходные файлы проекта
d----- test/            # вспомогательные и исходные файлы с тестами
d----- resources/       # директория с ресурсами
------ qt_project.pro   # файл qmake проекта
------ resources.qrc    # файл ресурсов
```

{% endcode %}

Проект лабораторной работы состоит из двух частей: проект и набор тестов. Проект состоит из заголовочных файлов и файлов с исходным кодом, включая `main.cpp`, содержащий точку входа программы. Unit-тесты для тестирования проекта располагаются в файлах в директории `test/`, точка входа для запуска тестов располагается в файле `tests.cpp`.

Если проект не включает в себя unit-тесты, то директория `test/` отсутствует.

## Описание проекта

В qmake-проекте можно описать несколько конфигураций. Ниже приведёна общая часть для обоих конфигураций: приложения и тестов.

{% code overflow="wrap" lineNumbers="true" %}

```cmake
# Template: результат сборки исполняемый файл (app), библиотека или плагин.
TEMPLATE += app

# Configs: определяет конфигурацию проекта и параметры компилятора.
CONFIG += c++latest
CONFIG += strict_c++

# Qt module: модули Qt, которые будут использоваться в проекте.
QT += core

# INCLUDEPATH: директории с заголовочными файлами. Аналог `-I` clang-а.
INCLUDEPATH += \
	include/

# HEADERS: список заголовочных файлов, используемых в проекте.
HEADERS += \
	include/common.h
    
# SOURCES: список файлов с исходным кодом, используемых в проекте.
SOURCES += \
	src/common.cpp
    
# RESOURCES: файл с ресурсами (QtResources).
RESOURCES += \
    resources.qrc
```

{% endcode %}

Осталось указать специфичные для наших конфигураций опции и файлы.

{% tabs %}
{% tab title="solution" %}
{% code overflow="wrap" lineNumbers="true" %}

```cmake
solution {
	# Solution - is GUI.
	CONFIG += qt

	# Qt modules.
	QT += widgets gui

	# Solution specific headers/sources.
	HEADERS +=
	SOURCES += \
		src/main.cpp
}
```

{% endcode %}
{% endtab %}

{% tab title="tests" %}
{% code overflow="wrap" lineNumbers="true" %}

```cmake
tests {
	# Tests - is commandline tool.
	CONFIG += cmdline

	# Tests specific headers/sources.
	SOURCES += \
		test/tests.cpp

    # Example of using googletests
	GTEST_INCLUDE = $$GTEST_ROOT/include
	GTEST_LIBPATH = $$GTEST_ROOT/lib

	INCLUDEPATH += $$GTEST_INCLUDE
	LIBS += -L$$GTEST_LIBPATH -lgtest
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

<details>

<summary>Итоговый файл проекта</summary>

{% code overflow="wrap" lineNumbers="true" %}

```cmake
TEMPLATE += app

CONFIG += c++latest
CONFIG += strict_c++

QT += core

INCLUDEPATH += \
	include/

HEADERS += \
	include/common.h
    
SOURCES += \
	src/common.cpp

RESOURCES += \
    resources.qrc

solution {
	CONFIG += qt

	QT += widgets gui

	HEADERS +=
	SOURCES += \
		src/main.cpp
}

tests {
	CONFIG += cmdline

	SOURCES += \
		test/tests.cpp

	GTEST_INCLUDE = $$GTEST_ROOT/include
	GTEST_LIBPATH = $$GTEST_ROOT/lib

	INCLUDEPATH += $$GTEST_INCLUDE
	LIBS += -L$$GTEST_LIBPATH -lgtest
}
```

{% endcode %}

</details>

## QtCreator

После описания файла проекта необходимо настроить конфигурации сборки.

Для этого после открытия проекта следует перейти в раздел Projects, выбрать интересующий Kit и для него перейти в Build.

Настроим Debug и Release как **`solution`**, начнём с Debug. Сверху в **Edit build configuration** выбираем `Debug`. Затем необходимо в Build Steps дополнить первый шаг **qmake** аргументом про нашу конфигурацию. Справа от `qmake: qmake qt_project.pro` нажимаем на Details, и в **Additional arguments:** дописываем `CONFIG+=solution`:

![](/files/60SD8DX9nPhDN3HG302Q)

Для настройки Release конфигурации действия аналогичны, в **Edit build configuration** выбираем `Release`.

Настроим Debug и Release как **`tests`**, начнём с Debug. В таком случае необходимо создать новые **build configuration**. Сверху выбираем **Add** - **Debug** и задаём уникальное имя для тестовой debug конфигурации.

После создания автоматически произойдёт переключение на созданную конфигурацию. Остаётся лишь указать аргументы для этой конфигурации. В нашем случае:

```cmake
CONFIG+=tests GTEST_ROOT="<path/to/googletest>"
```

`GTEST_ROOT` – переменная, которая используется в нашем примере проекта; содержит путь до корня googletests.

По окончании настройки конфигураций в левом нижнем меню при выборе Kit будут доступны настроенные конфигурации сборки, между которыми можно будет переключаться в 1 клик.

![](/files/QY6CNI2xojIwNupHYa1T)

## Terminal

Сборка из терминала представляет собой повтор Build Steps из настроек QtCreator.

{% tabs %}
{% tab title="Windows" %}
Конфигурация `solution` (основное решение).

```cmd
qmake qt_project.pro CONFIG+=solution
```

Конфигурация `tests` (тесты).

```cmd
qmake qt_project.pro CONFIG+=tests GTEST_ROOT=<path/to/googletest>
```

Так как GoogleTest будет динамическим, то дополнительно перед запуском.

```cmd
set PATH=<path/to/googletest>\bin;%PATH%
```

Сборка с использованием MSVC/cl.

```cmd
nmake -f Makefile.Debug
REM Debug-сборка

nmake -f Makefile.Release
REM Release-сборка
```

Запуск.

```cmd
.\debug\qt_project.exe
REM Debug

.\release\qt_project.exe
REM Release
```

{% endtab %}

{% tab title="Linux" %}
Конфигурация `solution` (основное решение) как Release cборка.

```bash
qmake qt_project.pro CONFIG+=solution CONFIG+=release
```

Как Debug сборка.

```bash
qmake qt_project.pro CONFIG+=solution CONFIG+=debug
```

Конфигурация `tests` (тесты) как Release сборка.

```bash
qmake qt_project.pro CONFIG+=tests CONFIG+=release GTEST_ROOT=<path/to/googletest>
```

Как Debug сборка.

```bash
qmake qt_project.pro CONFIG+=tests CONFIG+=debug GTEST_ROOT=<path/to/googletest>
```

Так как GoogleTest будет динамическим, то дополнительно перед запуском.

```bash
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:<path/to/googletest>/bin"
```

Сборка.

```bash
make
```

Запуск.

```bash
./qt_project
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://skkv-itmo.gitbook.io/c-cpp-cookies/environments/ide/qt-creator/qt-examples.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
