C

Qt Quick Ultralite static_library 示例

展示如何创建和使用 Qt Quick Ultralite 静态库。

概述

此示例展示了如何创建和集成 Qt Quick Ultralite 静态库与不同的应用程序。它包含两个目标:一个作为静态库编译的 Qt Quick Ultralite GUI 以及一个链接到静态库的可执行应用程序。应用程序还提供了一个简单的 API 来模拟传感器数据。Qt Quick Ultralite GUI 使用该接口接收传感器数据并在屏幕上显示。

有关如何作为静态库构建 Qt Quick Ultralite 的更多信息,请参见此处

注意:静态库设置在 FreeRTOS 上不起作用。

项目结构

项目包含两个子项目:一个 Qt Quick Ultralite GUI 静态库和一个可执行应用程序。这两个项目都有自己的 CMakeLists.txt 文件,用于创建相应的目标并添加依赖文件。

静态库 CMake 项目

要创建静态库目标 STATIC_LIBRARY,必须在 qul_add_target 函数的参数中提供选项。

...
qul_add_target(Qt4MCU_GUI STATIC_LIBRARY QML_PROJECT qt4mcu.qmlproject GENERATE_ENTRYPOINT)
...

接下来,使用库的 QmlProject 文件中的 InterfaceFiles.files 注册 sensorData.h 头文件作为 Qt Quick Ultralite 接口。它允许从主应用程序接收传感器数据。在该接口中的方法用于 mainGui.qml,它通过使用 QmlFiles.files 添加到项目中。

        QmlFiles {
                files: ["mainGui.qml"]
        }

        InterfaceFiles {
                files: ["sensorData.h"]
        }

将包含 sensorAPI.h 头文件的文件夹添加到包含目录列表中。

注意:EXAMPLE_ROOT_DIR 从应用程序 CMake 文件中派生。

...
target_include_directories(Qt4MCU_GUI
    PRIVATE
        ${EXAMPLE_ROOT_DIR}/include
)
...

mainGui.qml 使用 QtQuick.Controls QML 模块,这需要将 Qt4MCU_GUI 目标链接到 Qul::Controls 库。有关更多信息,请参阅 Qt Quick Ultralite 定制示例

        ModuleFiles {
                MCU.qulModules: ["Controls"]
        }

GENERATE_ENTRYPOINT 添加到 add_qul_target CMake 命令中以生成静态库的默认入口点。它会生成包含 qul_run() 入口点函数的 qul_run.h 头文件。应用程序必须调用此函数来配置和启动 Qt Quick Ultralite 引擎。

...
qul_add_target(Qt4MCU_GUI STATIC_LIBRARY QML_PROJECT qt4mcu.qmlproject GENERATE_ENTRYPOINT)
...

注意:Qul::initHardware() 函数不会在 qul_run() 被调用时执行,其中 initializeHardware 设置为 false

应用程序 CMake 项目

要创建一个 Qt Quick Ultralite 应用程序,请调用 add_executable CMake 函数。此外,请在目标源文件列表中包含 main.cpp 文件。

...
add_executable(static_library_example
        src/main.cpp
)
...

发布配置中的 Qt Quick Ultralite 静态库启用了跨过程优化(连接时优化)。这意味着链接到此类库的应用程序必须具有相同的配置。以下代码片段演示了如何在 Qt Quick Ultralite 静态库上执行 IPO 配置检查并将其应用于应用程序。

...
get_target_property(QUL_LIB_IPO_CONFIG Qt4MCU_GUI INTERPROCEDURAL_OPTIMIZATION)
set_target_properties(static_library_example PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${QUL_LIB_IPO_CONFIG})
...

应用程序必须包含 Qt Quick Ultralite 根目录和包含 qul_run.h 文件的文件夹路径。在此示例中,sensorAPI.h 是一个额外包含的头文件。

...
target_include_directories(static_library_example
    PRIVATE
        # Add include folder from QtForMCU installation folder
        ${Qul_DIR}/include
        # Add folder containing qul_run.h header file
        ${CMAKE_CURRENT_BINARY_DIR}/lib/Qt_for_MCU
        # Add folder containing sensorAPI.h header file
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)
...

应用程序还必须链接到静态库链接的所有库。

注意:Qt Quick Ultralite 中某些库之间存在循环依赖关系。您可以通过在列表底部链接到 Qul::Core 和 GUI 库来解决它,如下例所示。

target_link_libraries(static_library_example
    PRIVATE
        # Static library containing UI and interfaces
        Qt4MCU_GUI

        # Depending on which features the Qt4MCU_GUI static library is using,
        # you need to link the proper static library to the executable.
        # In this example list of the libraries which are changing depending on
        # CMake variables configuration are described. Just uncomment those which
        # apply to your setup. Config which applies to this example is uncommented.

        #
        # Font engines:
        #   - If QUL_FONT_ENGINE == Spark
        #       If QUL_PLATFORM_REQUIRED_IMAGE_ALIGNMENT not set or 0 or 1
        #           Qul::MonotypeFontEngine
        #       else
        #           Qul::MonotypeFontEngineAligned
        #
        #       If QUL_COMPLEX_TEXT_RENDERING == ON
        #           Qul::MonotypeShaperEngine
        #           Qul::MonotypeUnicodeEngine
        #       else
        #           Qul::MonotypeUnicodeEngineShaperDisabled
        #
        #   - If QUL_FONT_ENGINE == Static
        #           Qul::MonotypeUnicodeEngineShaperDisabled
        #
        Qul::MonotypeUnicodeEngineShaperDisabled

        # PNG decoder (add when project uses PNG images):
        #   - QUL_RESOURCE_COMPRESSION == ON
        # Qul::PNGDecoderLodePNG
        #   - QUL_RESOURCE_COMPRESSION not set or OFF
        # Qul::PNGDecoderNull

        # Additional lib which needs to be linked along to Qt QuickUltralite Core
        $<$<BOOL:${CMAKE_CROSSCOMPILING}>:Qul::DeviceLink>

        # Static library with Qt QuickUltralite Core
        Qul::Core
        # Static library with Qt QuickUltralite Platform abstraction.
        # Should be replaced by custom implementation adapted to target board
        Qul::Platform
        # All additional Qul libraries used by QtForMCU GUI needs to be also
        # linked with application
        Qul::Controls
        # Satisfy cyclic dependency between Qt4MCU_GUI and Qul::Core
        # libraries (Qul::Core depends on symbols autogenerated
        # in Qt4MCU_GUI build process)
        # Same sets of libraries chosen above need to match those below.
        # For example if above we choose Qul::MonotypeUnicodeEngineShaperDisabled
        # then here below we add the same library as cyclic dependency to Qul::Core.
        Qul::Core
        $<$<BOOL:${CMAKE_CROSSCOMPILING}>:Qul::DeviceLink>
        Qul::MonotypeUnicodeEngineShaperDisabled
        Qt4MCU_GUI
)
与 Qt Quick Ultralite 静态库接口

如前所述,示例应用程序通过 API 提供传感器数据。Qt Quick Ultralite 静态库使用此 API 获取传感器数据,并通过 Qt Quick Ultralite C++ 接口将其公开给 QML。

注意:Qt Quick Ultralite 不提供从单独的任务安全更改 QML 属性的线程安全方法。

...
#include "sensorAPI.h"

struct SensorData : Qul::Singleton<SensorData>
{
    SensorData()
        : sensorRawValue(0)
    {}
    Qul::Property<int> sensorRawValue;
    void updateSensorValue() { sensorRawValue.setValue(getSensorValue()); }
};
...

此示例中 getSensorValue() 函数返回一个随机值。

...
int getSensorValue()
{
    return static_cast<uint32_t>(static_cast<double>(100) * Qul::Platform::getPlatformInstance()->rand());
}
...

文件

在特定的 Qt 许可下可用。
了解更多信息。