C

将 Qt Quick Ultralite 应用程序构建为静态库

本主题提供了构建 Qt Quick Ultralite 应用程序作为静态库并与其外部项目集成的说明。

作为库构建

Qt Quick Ultralite 允许您使用 CMake 函数 qul_add_target 将 Qt Quick Ultralite 应用程序构建为静态库。除非在参数列表中添加了 STATIC_LIBRARY 选项,否则该函数默认构建一个可执行目标。请参见以下示例

qul_add_target(example_app
               STATIC_LIBRARY
               source1.cpp
               source2.cpp)

注意:静态库设置不能为 Qt Quick Ultralite FreeRTOS 平台配置编译,但它可以用于裸机配置并与其他外部 FreeRTOS 设置一起使用。虽然这种方法可行,但并不推荐,因为它可能导致意外的行为。

如果在 CMake 项目的文件中设置了 app_target_default_entrypoint,则会生成并复制到库输出目录的 qul_run.h 头文件。头文件包含具有 C-连接的 qul_run() 函数,该函数提供了标准的 Qt Quick Ultralite 应用程序入口点。

app_target_default_entrypoint(<target> QML_PROJECT <item>)

其中,target 是由 qul_add_target CMake 函数创建的目标,item 是将包含 Qt Quick Ultralite 应用程序配置的 QmlProject 文件的名称。

C-链接函数

为了允许更细致地控制 Qt Quick Ultralite 引擎的初始化步骤和调度,当构建作为静态库的应用程序时,会公开以下 C-链接函数

  • void qul_init_hardware(void);
  • void qul_init_platform(void);
  • void qul_init_application(void);
  • QulErrorHandler *qul_set_error_handler(QulErrorHandler *handler);
  • const char *qul_error_code_to_string(enum QulError code);
  • uint64_t qul_update_engine(void);
  • void qul_app_exec(void);

生成的 qul_run.cpp 文件最终将如下所示

extern "C" {

Qul::Application& _qul_app() {
    static Qul::Application _qul_app;
    return _qul_app;
}

mainScreen& _qul_item() {
    static struct ::mainScreen _qul_item;
    return _qul_item;
}

void qul_init_hardware(void)
{
    Qul::initHardware();
}

void qul_init_platform(void)
{
    Qul::initPlatform();
}

void qul_init_application(void)
{
    _qul_app().setRootItem(&_qul_item());

#ifdef APP_DEFAULT_UILANGUAGE
    _qul_app().settings().uiLanguage.setValue(APP_DEFAULT_UILANGUAGE);
#endif
}

uint64_t qul_update_engine(void)
{
    return _qul_app().update();
}

void qul_app_exec(void)
{
    _qul_app().exec();
}

} // extern "C"

int qul_run(bool initializeHardware)
{
    if (initializeHardware) qul_init_hardware();
    qul_init_platform();
    qul_init_application();
    qul_app_exec();
    return 0;
}

将静态库与外部项目集成

要将Qt Quick Ultralite应用库与外部项目集成,请将该外部项目与它以及所有使用的Qt Quick Ultralite库链接。一些库版本会根据Qt Quick Ultralite的配置有所不同。以下表格总结了这些库版本及其对应的Qt Quick Ultralite配置。

字体引擎
MCU.Config.fontEngine == 静态(默认)MCU.Config.fontEngine == Spark
Qul::MonotypeUnicodeEngineShaperDisabledCMake属性/变量1ONTrue0OFFFalse
MCU.Config.platformImageAlignment(默认)

Qul::MonotypeFontEngine

Qul::MonotypeFontEngineAligned
MCU.Config.complexTextRendering(默认)

Qul::MonotypeShaperEngine

Qul::MonotypeUnicodeEngine

Qul::MonotypeUnicodeEngineShaperDisabled
PNG解码器(仅在使用PNG文件时需要该库)
CMake属性/变量1ONTrue0OFFFalse
ImageFiles.MCU.resourceCompressionQul::PNGDecoderLodePNGQul::PNGDecoderNull(默认)

此外,将Qt Quick Ultralite的include路径复制或添加到外部项目的包含路径中。如果Qt Quick Ultralite应用提供了默认条目点,请复制或添加生成的qul_run.h头文件路径到外部项目的包含路径中。

接下来,在外部项目中重用现有的Qt Quick Ultralite平台抽象代码,或者为您目标板创建一个新的。有关更多信息,请参阅Qt Quick Ultralite平台移植指南

最后,根据在应用程序中运行Qt Quick Ultralite指南,在外部项目中创建一个入口点函数。如果使用默认条入口点,包含生成的qul_run.h头文件,并在期望位置调用qul_run()函数来初始化和启动Qt Quick Ultralite引擎。

注意:Qul::initHardware()在调用qul_run()且将initializeHardware设置为false时不会调用。

调用qul_run()函数后,控制跳转到Qul::Platform::exec(),这是特定于每个平台抽象的。所有与Qt for MCUs一起提供的平台抽象示例的实现中都包含一个无限while循环。这意味着其余的UI代码必须移动到相应的Qul::Platform::exec()实现,或者它必须是基于中断的。

如果外部项目使用RTOS,Qt Quick Ultralite可以在单独的线程中运行。在这种情况下,用户需要提供带有Qt Quick Ultralite的安全接口,因为嵌入式事件系统不能从其他线程直接更新。

另请参阅:MCU.Config.fontEngine

在本特定Qt许可证下可用。
了解更多。