Qt Quick Ultralite の API の概要

Qt for MCU 向けに開発された、Qt Quick のランタイムで利用可能な C++ の API のドキュメントが公開されていましたので紹介します。

Qul::Items::QtObject

C++ で QML のエレメントを生成するための基底クラスです。

#include <qul/QtObject>

struct MyObject : public Qul::Items::QtObject
{
    void start();
};

public かつ、非 override な関数は QML からアクセス可能になります。

Item {
    Task {
        id: task
    }
    Component.onCompleted: task.start()
}

enum

クラス内で定義された enum は QML からも利用可能になります。

#include <qul/QtObject>

struct Task : public Qul::Items::QtObject
{
    enum Status {
        Success,
        Error,
    };
    void start();
};

Qul::Property

QML のプロパティのためのクラスになります。

#include <qul/QtObject>
#include <qul/Property>

struct Task : public Qul::Items::QtObject
{
    enum Status {
        Success,
        Error,
    };
    void start();
    Qul::Property<int> interval;
};
Item {
    Task {
        id: task
        interval: 10
    }
    Component.onCompleted: task.start()
}

プロパティのグループ化

struct MyData : public Qul::Items::QtObject
{
    struct Coordinate {
        Qul::Property<float> lat;
        Qul::Property<float> lng;
    }
    Coordinate coordinate;
    Qul::Property<int> zoom;
};

構造体内構造体を作成すると、以下のようにグループ化が可能になります。

Item {
    MyData {
        coordinate.lat: 36.0816533
        coordinate.lng: 140.1095272
        z: 17
    }
}

Qul::Signal

QML のシグナルのためのクラスになります。

#include <qul/QtObject>
#include <qul/Property>
#include <qul/Signal>

struct Task : public Qul::Items::QtObject
{
    enum Status {
        Stopped,
        Running,
    };
    void start();
    Qul::Property<int> interval;
    Qul::Signal<void(Task::Status status)> finished;
};
Item {
    Task {
        id: task
        interval: 10
        onFinished: { ... }
    }
    Component.onCompleted: task.start()
}

Qul::Items::Singleton

QtObject の派生クラスで、QML のアイテムをシングルトン化し、グローバルにアクセスできるようにするための基底クラスになります。

#include <Singleton>

struct Global : public Qul::Items::Singleton<Constants>
{
    void doSomething();
};
Item {
    Component.onCompleted: Global.doSomething()
}

Qul::Model

QML で利用するモデルの基底クラスになります。

#include <qul/Model>

struct ModelData {
    int key;
    int value;
};

struct MyModel : public Qul::Model<ModelData> {
    std::vector<ModelData> m_data;
    int count() const override {
        return m_data.size();
    }
    ModelData get(int idx) const override {
        return m_data.at(idx);
    }

    void append(int key, int value) {
        ModelData data = { key, value };
        m_data.push_back(data);
        modelReset();
    }
};

Qul::Timer

シンプルなタイマーになります。

#include <qul/Timer>

void Task::start() {
    Qul::Timer timer;
    timer.onTimeout([this]() { finished(Success); });
    timer.start(1000);
 }

まとめ

QtObject や QtQml が提供している、これまでの Qt Quick での C++ とはまた違う形の API になっていますが、見た目もすっきりしていて分かりやすいですね。

Qt 6 では、こういった形でも書けるようになるのかと思うとワクワクしてきます。

あわせて読みたい