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 许可下可用。
了解更多信息。