Предисловие

Разделение функционала по подпроектам.

Когда проект разрастается и начинает затрудняться в первую очередь ориентация что/где находится, во вторых начинает долго пересобираться проект. Все это приводит к желанию как-то логично разделить проект по функционалу и вынести все в отдельные подпроекты.

pro

Что мы имеем с технологией qmake. В первую очередь это TEMPLATE = SUBDIRS. Точками входа (узлами) являются pro файлы.

Примечание: по такому принципу же построены и сами Qt исходники (смотрите src.pro).

SUBDIRS могут быть и вложенными друг в друга.

У SUBDIRS может быть только один APP проект с main.cpp, остальные должны быть библиотеками, что логично.

pri

И второй вариант разделения это на основе include(*.pri). Инклуды также можно вкладывать друг в друга.

В SUBDIRS можно определять последовательность сборки файлов. В include на самом деле это не очевидно.

Конечно сначала всегда самый первый проект надо делать как SUBDIRS и далее в нем создать несколько подпроектов на основе pro файлов. Это если вы хотите иметь один APP и несколько внешних библиотек.

В этом случае появляется возможность пересобирать подпроекты независимо.
(qmake, rebuild) можно делать отдельно для каждого pro файла.

subdirs удобны еще тем, что визуально subdirs подпроекты строятся как ветки (деревья) которые можно раскрывать/закрывать в визуальной среде Qt Creator.

include(...pri) по сути просто включения, как макросы в с++ (только в среде pro файлов). Они добавляют в визуальном дереве проекта узлы, но на одном уровне с текущим pro файлом, которому они принадлежат.

Все, что было описано выше это инструмент.

Логика

На самом деле самое трудное это далее логично разделить функционал программы по файлам и разнести файлы по своим подпроектам.

Например исходники Qt 4.8.1 src.pro разделены по принципу один верхний subdirs и далее в каждом подроекте несколько инклудов.

Далее применяется принцип зависимости последовательности сборки подпроектов и получается так, что нельзя например собрать QtNetwork без предварительной сборки QtCore.

И еще в качестве результата сборки подпроекта subdirs получается библиотека и только один подпроект в subdirs может быть TEMPLATE = APP, в котором есть файл main.c.

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

Таким образом делаем как исходники самого Qt. Первый subdirs, далее 8..10 подпроектов, в которых инклюдами подключается функционал на одном уровне в файловой ситеме, то есть уже без вложенностей.