qt为方便对功能和代码进行删减和系统兼容,将代码拆分成很多模块且对每个模块梳理出feature,为了简化程序的使用和其他目的,一个模块编译成一个单独的dll,qt还对每个模块的头文件分成public部分和private部分。在编译模块前,通过修改模块对应源码文件夹下的confiure.json控制feature开关来删减系统不支持或者不必要的feature,对应feature的condition是可配置的,感兴趣的可以查看qt的编译脚本文件(shell脚本/dos脚本)。
在配置好模块的configure.json后,运行configure启动编译脚本(shell脚本/dos脚本),过程中会自动为模块生成对应头文件,比如widgets 模块,会生成qtwidgets-config.h和qtwidgets-config-p.h,每一个属性在.h中都有一个宏,作为代码的宏开关,值一般为1或-1,用于控制模块源码的逻辑,其内容如下:
在qt 的源文件qglobal.h中有这样两个方便使用feature对应宏开关的宏定义QT_CONFIG和QT_REQUIRE_CONFIG:
- //QtInstallDir\Qt5.12.0\5.12.0\msvc2015_64\include\QtCore\qglobal.h
- #define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)
- #define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1, "Required feature " #feature " for file " __FILE__ " not available.")
qt模块编译好后会产生对应qt_lib_*.pri和qt_lib_*_private.pri脚本(qmake language脚本)文件,方便qmake生成makefile时查询模块是否支持对应的feature。下面是qt_lib_core.pri文件内容:
- #D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_core.pri
- QT.core.VERSION = 5.12.0
- QT.core.name = QtCore
- QT.core.module = Qt5Core
- QT.core.libs = $$QT_MODULE_LIB_BASE
- QT.core.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtCore
- QT.core.frameworks =
- QT.core.bins = $$QT_MODULE_BIN_BASE
- QT.core.depends =
- QT.core.uses = libatomic
- QT.core.module_config = v2
- QT.core.CONFIG = moc resources
- QT.core.DEFINES = QT_CORE_LIB
- QT.core.enabled_features = properties animation textcodec big_codecs codecs commandlineparser cxx11_future textdate datestring filesystemiterator filesystemwatcher gestures itemmodel proxymodel identityproxymodel library mimetype processenvironment process statemachine qeventtransition regularexpression settings sharedmemory sortfilterproxymodel std-atomic64 stringlistmodel systemsemaphore temporaryfile timezone topleveldomain translation xmlstream xmlstreamreader xmlstreamwriter
- QT.core.disabled_features =
- QT_CONFIG += properties animation textcodec big_codecs codecs textdate datestring doubleconversion filesystemiterator filesystemwatcher gestures itemmodel proxymodel identityproxymodel library mimetype process statemachine regularexpression settings sharedmemory sortfilterproxymodel stringlistmodel systemsemaphore temporaryfile translation xmlstream xmlstreamreader xmlstreamwriter
- QT_MODULES += core
里面的QT.core.enabled_features项描述了core模块所支持的特性,所有的features是在编译模块源码之前,事先配置对应模块(module)源码文件夹下的configure.json文件内容的执行结果。qt_lib_*.pri只是提供一个方便脚本(qmake language脚本)快速查询的结果的功能。对比可以发现,qt_lib_*.pri中的enable_features项与qt*-config.h中的项基本一一对应。
脚本查询的入口参考:qtConfig(inputdialog)
qtConfig()查询的是模块中的enabled_features值,这个脚本中的QT_CONFIG暂时没有发现有什么用。
QT_CONFIG宏用法及支持的参数_荆楚闲人的博客-CSDN博客_qtconfig
qt 私有头文件 private_丘上人的博客-CSDN博客
qmake language qt 工程文件 配置文件 .pro .prl .prf .pri 词法 语法 for循环 判断语句 函数定义_丘上人的博客-CSDN博客