¿Cómo usar la plantilla de subdirectorios de QMake?

Estoy empezando a aprender Qt. Me estoy moviendo del mundo de Visual Studio y estoy buscando una forma de organizar la estructura de mi proyecto usando QMake. Encontré la plantilla ‘subdirectorios’, pero me cuesta bastante entenderla.

Mi estructura de proyecto se ve así:

project_dir/ main.cpp project.pro logic/ logic.pro some logic files gui/ gui.pro gui files 

Mi project.pro se parece a esto

 TEMPLATE = subdirs SUBDIRS = logic \ gui SOURCES += main.cpp 

En los archivos .pro para los subdirectorios, tengo las variables apropiadas SOURCES , HEADERS y RESOURCES .

Por favor, dígame qué TARGET , TEMPLATE y otros valores necesarios debo establecer en los archivos .pro .

Además, ¿hay algún buen tutorial de QMake aparte del oficial?

Además del comentario de Troubadour , señalaría que el objective SUBDIRS solo sirve para especificar subdirectorios. Por lo tanto, su línea adicional de

 SOURCES += main.cpp 

en su archivo project.pro es incorrecto, y probablemente no logre construir su archivo main.cpp, en el peor. En el mejor de los casos, qmake se negará a analizar el archivo, ya que contiene especificaciones contradictorias.

He usado la plantilla SUBDIRS varias veces, y funciona bien si puedes construir partes en bibliotecas más o menos independientes, al parecer como lo has hecho con la lógica y la interfaz gráfica separadas. Aquí hay una manera de hacer esto:

 project_dir/ -project.pro -common.pri -logic/ ----logic.pro ----some logic files -gui/ ----gui.pro ----gui files -build/ ----build.pro ----main.cpp 

project.pro:

 TEMPLATE = subdirs SUBDIRS = logic \ gui # build must be last: CONFIG += ordered SUBDIRS += build 

common.pri:

 #Includes common configuration for all subdirectory .pro files. INCLUDEPATH += . .. WARNINGS += -Wall TEMPLATE = lib # The following keeps the generated files at least somewhat separate # from the source files. UI_DIR = uics MOC_DIR = mocs OBJECTS_DIR = objs 

logic / logic.pro:

 # Check if the config file exists ! include( ../common.pri ) { error( "Couldn't find the common.pri file!" ) } HEADERS += logic.h SOURCES += logic.cpp # By default, TARGET is the same as the directory, so it will make # liblogic.a (in linux). Uncomment to override. # TARGET = target 

gui / gui.pro:

 ! include( ../common.pri ) { error( "Couldn't find the common.pri file!" ) } FORMS += gui.ui HEADERS += gui.h SOURCES += gui.cpp # By default, TARGET is the same as the directory, so it will make # libgui.a (in linux). Uncomment to override. # TARGET = target 

build / build.pro:

 TEMPLATE = app SOURCES += main.cpp LIBS += -L../logic -L../gui -llogic -lgui # Will build the final executable in the main project directory. TARGET = ../project 

subdirs si las carpetas de lógica y gui realmente representan algún tipo de objective, ej. una biblioteca, que se puede construir independientemente de cualquier otra cosa. Si ese es el caso, solo usa

 TEMPLATE = lib TARGET = logic CONFIG += dll 

en logic.pro.

Si no son objectives independientes, sino solo carpetas que existen para organizar los archivos de fonts, puede utilizar un archivo .pri en cada uno e incluirlos en .pro usando

 include(logic/logic.pri) include(gui/gui.pri) 

Solo recuerde que las rutas de archivos en los archivos .pri son relativas al archivo .pro y no al .pri. Por cierto, el uso de un archivo .pri es opcional, ya que puede seguir enumerando los archivos en esas carpetas directamente en el archivo .pro. El archivo .pri lo hace un poco más ordenado y ayuda a mantener el archivo .pro más corto.