构建系统集成

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_VERBOSE

启用所有ifcodegen函数的详细日志记录。

QT_IFCODEGEN_TEMPLATE_SEARCH_PATH

ifcodegen模板的搜索路径。

命令

qt_ifcodegen_extend_target

使用来自qface IDL文件的文件扩展目标。

qt_ifcodegen_generate

从qface IDL文件生成文件。

qt_ifcodegen_import_variables

从qface IDL文件生成文件,并为CMake提供变量。

qt_set_ifcodegen_variable

在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 公司的商标。所有其他商标均为其各自所有者的财产。