构建系统集成
Qt接口框架生成器完全集成在qmake和CMake中,用于生成项目的所有内容或部分内容。
在它的最简单形式中,qmake/CMake可以生成所有源代码,项目只需要配置要构建的项目类型。
对于复杂设置,您可以结合生成的代码与应用特定的代码来扩展和使用生成的代码。
QMake
示例
CONFIG += ifcodegen QT_FOR_CONFIG += interfaceframework !qtConfig(ifcodegen): error("No ifcodegen available") IFCODEGEN_TEMPLATE = frontend IFCODEGEN_SOURCES = example.qface IFCODEGEN_MODULE_NAME = myModule IFCODEGEN_OUTPUT_DIR = myOutputDir IFCODEGEN_ANNOTATIONS = annotation.yaml
以下是一些可用的qmake变量
IFCODEGEN_TEMPLATE | 前端(默认),模拟后端 |
IFCODEGEN_SOURCES | 单个 .qface 输入文件。 |
IFCODEGEN_MODULE_NAME | 可选。使用生成的代码的模块名称。 |
IFCODEGEN_OUTPUT_DIR | 生成的代码放置的输出文件夹。默认位置是当前构建文件夹。 |
IFCODEGEN_ANNOTATIONS | 一组额外的注解文件,格式为YAML。更多信息,请参阅注解选项。 |
IFCODEGEN_IMPORT_PATH | 一组导入路径,当一个接口定义语言(IDL)文件使用导入语句时,会考虑这些路径。更多信息,请参阅导入选项。 |
有关生成器的命令行参数的更多详细信息,请参阅使用生成器。
注意:由于
ifcodegen
有特定的系统依赖项,它可能不在所有QtInterfaceFramework安装中可用。在这种情况下,ifcodegen
qmake功能也不可用,这可能导致构建错误。在这种情况下,请使用以下代码片段,确保构建停止并提供有意义的错误消息
QT_FOR_CONFIG += interfaceframework !qtConfig(ifcodegen): error("No ifcodegen available")
CMake
CMake中,以下函数和变量由QtInterfaceFramework包提供。
变量
启用所有ifcodegen函数的详细日志记录。 | |
ifcodegen模板的搜索路径。 |
命令
使用来自qface IDL文件的文件扩展目标。 | |
从qface IDL文件生成文件。 | |
从qface IDL文件生成文件,并为CMake提供变量。 | |
在ifcodegen模板中设置给定值变量。 |
Qt模块支持
CMake
此集成也支持生成可以随后编译成 Qt 模块的代码。以下将展示如何使用 CMake 构建名为 MyModule 的模块
qt_ifcodegen_generate( IDL_FILES mymodule.qface TEMPLATE frontend MODULE_NAME QtMyModule ) qt_internal_add_module(MyModule LIBRARIES Qt::CorePrivate Qt::InterfaceFrameworkPrivate PUBLIC_LIBRARIES Qt::Core Qt::InterfaceFramework PRIVATE_MODULE_INTERFACE Qt::CorePrivate Qt::InterfaceFrameworkPrivate ) qt_ifcodegen_extend_target(MyModule NO_GENERATE IDL_FILES mymodule.qface )
在定义模块之前,需要生成代码,因为这时代码需要同步给 syncqt。之后使用的代码来扩展模块目标。
SyncQt
除了模块库的项目文件外,还需要更改 sync.profile
,因为它用于调用用于生成转发头文件的 syncqt.pl
脚本。通常,sync.profile
配置为在源文件夹中搜索这些头文件。使用 $out_basedir
,也可以扩展脚本以在构建文件夹中搜索。
... %modules = ( # path to module name map "QtMyModule" => "$basedir/src/mymodule;$out_basedir/src/mymodule" ); ...
QML 类型注册
根据使用的构建系统以及 QtInterfaceFramework 模块的版本,有多种方式可以生成 QML 插件并注册 QML 类型。
CMake
在 CMake 中首选的方式是使用新的 QML 类型注册系统,该系统从版本 6.3 以上的 QtInterfaceFramework 模块中可用。在那个版本中,生成的代码已经使用了新的注册扩展名,并为 CMake 生成其余部分提供了所有必要的信息。
qt_ifcodegen_extend_target(MyModule NO_GENERATE PREFIX MYMODULE IDL_FILES mymodule.qface ) qt_add_qml_module(MyModule URI ${MYMODULE_URI} VERSION ${MYMODULE_VERSION} RESOURCE_PREFIX "/" CLASS_NAME QtMyModulePlugin PLUGIN_TARGET qtmymoduleplugin IMPORTS QtInterfaceFramework )
通过在 qt_ifcodegen_extend_target 调用中使用 PREFIX
参数,可以公开更多的变量,这些变量使用 MYMODULE
作为它们的前缀。这些变量可以用于以下调用,即 qt_add_qml_module,该调用处理所有类型的 QML 类型注册,并生成一个 QML 插件。
在 6.3 之前
如果不能使用新的 QML 类型注册,可以使用 ifcodegen 生成一个 QML 插件,该插件在加载时注册所有类型。
qt_ifcodegen_import_variables(MYMODULE IDL_FILES mymodule.qface TEMPLATE qmlplugin MODULE_NAME QtMyModule ) qt_add_qml_module(qtmymoduleplugin URI ${MYMODULE_URI} VERSION ${MYMODULE_VERSION} RESOURCE_PREFIX "/" PLUGIN_TARGET qtmymoduleplugin NO_PLUGIN_OPTIONAL NO_GENERATE_PLUGIN_SOURCE NO_GENERATE_QMLTYPES NO_GENERATE_QMLDIR SOURCES ${MYMODULE_SOURCES} PUBLIC_LIBRARIES Qt::InterfaceFramework Qt::MyModule )
© 2024 Qt 公司有限公司。此处包含的文档贡献是各自所有者的版权。本提供的文档受自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款约束。Qt 及其相关标志是芬兰及其它国家/地区的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。