12,982
回編集
(→使用例 1) |
|||
172行目: | 172行目: | ||
== QML_SINGLETONを使用する場合 == | == QML_SINGLETONを使用する場合 == | ||
==== 使用例 | ==== 使用例 : デフォルトコンストラクタを使用する場合 ==== | ||
以下の例では、QML_SINGLETONマクロを使用してConfigServiceをシングルトンクラスとして定義して、アプリケーションのテーマとダークモードの設定を管理している。<br> | 以下の例では、QML_SINGLETONマクロを使用してConfigServiceをシングルトンクラスとして定義して、アプリケーションのテーマとダークモードの設定を管理している。<br> | ||
<br> | <br> | ||
322行目: | 322行目: | ||
Component.onCompleted: { | Component.onCompleted: { | ||
ConfigService.loadSettings() | ConfigService.loadSettings() | ||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 使用例 : 静的ファクトリー関数を使用する場合 ==== | |||
QML_SINGLETONマクロは、C++クラスをQMLシングルトンとして登録するために使用する。<br> | |||
<br> | |||
デフォルトコンストラクタが存在せず、静的ファクトリー関数が存在する場合、<br> | |||
まず、クラス宣言において、QML_SINGLETONマクロを使用する。<br> | |||
これは通常、クラスのpublicセクションに配置する。<br> | |||
<br> | |||
次に、静的ファクトリー関数を定義する。<br> | |||
この関数は、シングルトンインスタンスを作成して返す役割を持つ。<br> | |||
以下の例では、createSingletonという名前の関数を定義している。<br> | |||
<br> | |||
<code>QML_SINGLETON</code>マクロの引数には、この静的ファクトリー関数を指定する。<br> | |||
つまり、<code>QML_SINGLETON(<クラス名>, createSingleton)</code>のような形式となる。<br> | |||
<br> | |||
実装する場合には、静的メンバー変数を使用してシングルトンインスタンスを保持して、静的ファクトリー関数内でこのインスタンスを生成・返却する方法が一般的である。<br> | |||
<br> | |||
QMLエンジンがシングルトンを必要とするまで、実際のインスタンス生成を遅延させることができる。<br> | |||
これにより、リソースの効率的な利用が可能になる。<br> | |||
<br> | |||
※注意<br> | |||
スレッドセーフティに関しても考慮が必要である。<br> | |||
複数のスレッドから同時にアクセスされる可能性がある場合、適切な同期メカニズムを実装することが重要となる。<br> | |||
<br> | |||
このアプローチを使用することにより、デフォルトコンストラクタを持たないクラスでも、QMLシングルトンとして効果的に機能させることができる。<br> | |||
静的ファクトリー関数を通じて、インスタンスの生成・返却を細かく制御できるため、より柔軟性の高い設計が可能になる。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// MySingleton.hファイル | |||
#include <QObject> | |||
#include <QtQml/qqmlregistration.h> | |||
#include <QDebug> | |||
class MySingleton : public QObject | |||
{ | |||
Q_OBJECT | |||
QML_SINGLETON(MySingleton, createSingleton) | |||
private: | |||
explicit MySingleton(QObject *parent = nullptr) : QObject(parent) {} | |||
static MySingleton* instance; | |||
public: | |||
Q_INVOKABLE void doSomething() | |||
{ | |||
qDebug() << "MySingleton is doing something!"; | |||
} | |||
static MySingleton *createSingleton(QQmlEngine *engine, QJSEngine *scriptEngine) | |||
{ | |||
Q_UNUSED(engine) | |||
Q_UNUSED(scriptEngine) | |||
if (!instance) { | |||
instance = new MySingleton(); | |||
} | |||
return instance; | |||
} | |||
}; | |||
MySingleton* MySingleton::instance = nullptr; | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// main.cppファイル | |||
#include <QGuiApplication> | |||
#include <QQmlApplicationEngine> | |||
#include "MySingleton.h" | |||
int main(int argc, char *argv[]) | |||
{ | |||
QGuiApplication app(argc, argv); | |||
QQmlApplicationEngine engine; | |||
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); | |||
return app.exec(); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="qml"> | |||
// main.qmlファイル | |||
import QtQuick | |||
import QtQuick.Window | |||
import com.example 1.0 | |||
Window { | |||
width: 640 | |||
height: 480 | |||
visible: true | |||
title: qsTr("QML Singleton Example") | |||
Text { | |||
anchors.centerIn: parent | |||
text: "Click me!" | |||
font.pixelSize: 24 | |||
MouseArea { | |||
anchors.fill: parent | |||
onClicked: { | |||
MySingleton.doSomething() | |||
} | |||
} | |||
} | } | ||
} | } |