「QMLの基礎 - シングルトン」の版間の差分

ナビゲーションに移動 検索に移動
172行目: 172行目:


== QML_SINGLETONを使用する場合 ==
== QML_SINGLETONを使用する場合 ==
==== 使用例 1 ====
==== 使用例 : デフォルトコンストラクタを使用する場合 ====
以下の例では、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()
          }
      }
     }
     }
  }
  }

案内メニュー