C

在应用程序中运行 Qt Quick Ultralite

启动并进入 Qt Quick Ultralite 事件循环

硬件初始化的方式和时间由应用程序开发人员决定。通常,在调用 Qul::initPlatform() 之前调用 Qul::initHardware()(),但开发人员也可以选择不调用它,并执行自己的硬件初始化。

要启动应用程序的图形部分,需要调用 Qul::initPlatform(),在你的 main() 或任务函数中创建一个 Qul::Application 对象,然后调用 Qul::Application::exec() 函数。

Qul::initPlatform() 初始化 Qt Quick Ultralite 平台组件,当调用 Qul::Application::exec()() 时事件循环开始。

或者,可以通过定期调用 Qul::Application::update()() 来运行 Qt Quick Ultralite 事件循环。

裸金属

例如,如果 QML 中定义的 main 项称为 MainScreen,裸金属的 main.cpp 中可以包含以下代码

#include "MainScreen.h"

#include <qul/application.h>
#include <qul/qul.h>

int main()
{
    Qul::initHardware();
    Qul::initPlatform();
    Qul::Application app;
    static MainScreen item;
    app.setRootItem(&item);
    while (true) {
        uint64_t now = Qul::Platform::getPlatformInstance()->currentTimestamp();
        // <handle timers>
        uint64_t nextUpdate = app.update();
        if (nextUpdate > now) {
            // Device can go to sleep until next update is due

            // enterLowPowerMode(nextUpdate - now);
        }
    }
    return 1;
}

FreeRTOS

Main.cpp 示例

#include "MainScreen.h"

#include <qul/application.h>
#include <qul/qul.h>
#include <platforminterface/log.h>

#include <FreeRTOS.h>
#include <task.h>

#ifndef QUL_STACK_SIZE
#error QUL_STACK_SIZE must be defined.
#endif

static void Qul_Thread(void *argument);
// extern const HeapRegion_t xHeapRegions[]; // HeapRegion for FreeRTOS Heap_5

int main()
{
    Qul::initHardware();
    // vPortDefineHeapRegions(xHeapRegions); // Initialize FreeRTOS Heap_5
    Qul::initPlatform();

    if (xTaskCreate(Qul_Thread, "QulExec", QUL_STACK_SIZE, 0, 4, 0) != pdPASS) {
        Qul::PlatformInterface::log("Task creation failed!.\r\n");
        configASSERT(false);
    }

    vTaskStartScheduler();

    // Should not reach this point
    return 1;
}

static void Qul_Thread(void *argument)
{
    Qul::Application app;
    static MainScreen item;
    app.setRootItem(&item);
    while (true)
        app.update();
}

注意:在调用 Qul::initPlatform()() 之前必须初始化 FreeRTOS Heap_5。

初始化文本缓存

裸金属

要为应用程序配置文本缓存,请在 main.app 中调用适当的 Qul::Application 构造函数,如下例所示

#include "MainScreen.h"

#include <qul/application.h>
#include <qul/qul.h>

int main()
{
    Qul::initHardware();
    Qul::initPlatform();

    Qul::ApplicationConfiguration appConfig;
    appConfig.setTextCacheEnabled(true);
    appConfig.setTextCacheSize(128 * 1024);
    Qul::Application app(appConfig);

    static MainScreen item;
    app.setRootItem(&item);
    while (true) {
        uint64_t now = Qul::Platform::getPlatformInstance()->currentTimestamp();
        // <handle timers>
        uint64_t nextUpdate = app.update();
        if (nextUpdate > now) {
            // Device can go to sleep until next update is due

            // enterLowPowerMode(nextUpdate - now);
        }
    }
    return 1;
}

FreeRTOS

Main.cpp 示例

#include "MainScreen.h"

#include <qul/application.h>
#include <qul/qul.h>
#include <platforminterface/log.h>

#include <FreeRTOS.h>
#include <task.h>

#ifndef QUL_STACK_SIZE
#error QUL_STACK_SIZE must be defined.
#endif

static void Qul_Thread(void *argument);
// extern const HeapRegion_t xHeapRegions[]; // HeapRegion for FreeRTOS Heap_5

int main()
{
    Qul::initHardware();
    // vPortDefineHeapRegions(xHeapRegions); // Initialize FreeRTOS Heap_5
    Qul::initPlatform();

    if (xTaskCreate(Qul_Thread, "QulExec", QUL_STACK_SIZE, 0, 4, 0) != pdPASS) {
        Qul::PlatformInterface::log("Task creation failed!.\r\n");
        configASSERT(false);
    }

    vTaskStartScheduler();

    // Should not reach this point
    return 1;
}

static void Qul_Thread(void *argument)
{
    Qul::ApplicationConfiguration appConfig;
    appConfig.setTextCacheEnabled(true);
    appConfig.setTextCacheSize(64 * 1024);
    Qul::Application app(appConfig);

    static MainScreen item;
    app.setRootItem(&item);
    while (true)
        app.update();
}

在特定的 Qt 许可证下可用。
了解详情。