Разработка приложений на Qt. Часть 3 — Обзор структуры проекта

В предыдущий раз мы успешно создали проект с нужной нам конфигурацией из четырех файлов:

main.cpp
HelloWorld.pro
widget.cpp
widget.h

Давайте разберем по полочкам каждый из них. Начнем с файла .pro :

Файл .pro  — файл проекта. В нем декларируются основные параметры проекта, такие как подключаемые модули, шаблон приложения, список исходных кодов программы, а так же заголовочных файлов. В первой строке подключаются два основных компонента — core и gui, ответственных за ядро Qt и компоненты пользовательского интерфейса. Теперь, например, если мы хотим использовать сетевые возможности библиотеки, необходимо дописать имя компонента: network  и сохранить файл. Qt Creator сразу же распарсит его и все классы данного компонента станут доступны в проекте. Все остальное и многое другое необходимо для системы сборки проекта qmake . Подробнее об этом можно прочитать в документации.

Далее посмотрим на файлы widget.cpp:

и widget.h:

Это файлы основного класса приложения. Напомню: специфика языка Си и следовательно C++ такова, что в файле .h мы можем описать объявление переменных, функций, сигналов, слотов и прочего добра, а в .cpp описать определение, то есть реализацию. Вам никто не мешает совмещать объявление и реализацию в одном файле .cpp, но подобное разделение считается хорошим тоном.

Файл widget.h содержит строку:

Это макрос и именно он делает всю магию. Дело в том, что язык С++ не знает о таких вещах как сигнально-слотовые соединения, иерархии объектов и о многих других вещах Qt. Здесь в дело вступает Метаобъектный компилятор ( MOC , входит в состав Qt). Если класс использует, например, сигналы и слоты, то этот макрос должен стоять сразу же после строки объявления класса. MOC  — это по сути не компилятор, а кодогенератор и разворачивает макрос Q_OBJECT , в зависимости от системы, в нужный компилятору C++ код (добавляет метаобъектную информацию). В результате этой работы, при запуске проекта генерируются файлы с префиксом moc_  в начале имени (любой желающий может в них заглянуть), именно они в итоге скармливаются компилятору С++.

Разбирая этот файл с начала видим — подключается заголовочник QWidget , далее идет объявление нашего класса наследуемого от QWidget , следом Q_OBJECT  и объявления конструктора и деструктора класса.

Файл widget.cpp по умолчанию состоит из пустой реализации конструктора и деструктора. Пока там ничего интересного нет. Но это пока.

Файл main.cpp:

Здесь самое интересное в подключении QApplication . Этот класс содержит т.н. цикл обработки событий. Далее идет создание экземпляра класса Widget  и отображение его на экране через метод show() . После выполнения программа отображается с запуском через exec()бесконечного цикла обработки тех или иных событий. Разработка GUI приложений отличается от консольной тем, что программа выполняется не линейно, а в зависимости от наступления некоторых событий (принцип event-driven или Событийно-ориентированное программирование). И вот этот цикл ждет наступления таковых событий, например нажатия кнопки, и выполняет соответствующий код запрограммированный на это событие.

В следующей статье начнем создавать свое первое приложение, теперь у вас есть все необходимые для этого знания.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *