📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

22行目: 22行目:


== QML_SINGLETONマクロ ==
== QML_SINGLETONマクロ ==
==== QML_SINGLETONマクロとは ====
<code>QML_SINGLETON</code>マクロは、QML環境において、C++クラスをQMLシングルトンとして露出させるために使用する。<br>
<code>QML_SINGLETON</code>マクロを使用することにより、QMLコードからグローバルに利用可能な単一のインスタンスを生成することができる。<br>
<br>
主な目的は、アプリケーション全体で共有される状態やサービスを提供することである。<br>
例えば、設定管理、ログ記録、ネットワーク接続管理等のグローバルサービスを実装する場合に非常に有効である。<br>
<br>
QMLにおいて、内包する型がシングルトンであることを宣言するには、<code>QObject</code>クラスを継承したクラスを記述して、<code>QML_SINGLETON</code>マクロを使用する。<br>
QMLにおいて、内包する型がシングルトンであることを宣言するには、<code>QObject</code>クラスを継承したクラスを記述して、<code>QML_SINGLETON</code>マクロを使用する。<br>
<br>
これは、そのクラスが<code>Q_OBJECT</code>マクロが記述されており、QMLで利用可能である場合(<code>QML_ELEMENT</code>マクロまたは<code>QML_NAMED_ELEMENT()</code>マクロを持つ場合)にのみ有効である。<br>
これは、そのクラスが<code>Q_OBJECT</code>マクロが記述されており、QMLで利用可能である場合(<code>QML_ELEMENT</code>マクロまたは<code>QML_NAMED_ELEMENT()</code>マクロを持つ場合)にのみ有効である。<br>
<br>
<br>
<u>Qt 5の場合</u>、デフォルトでは、各<code>QQmlEngine</code>クラスは、その型に最初にアクセスした時、その型のデフォルトコンストラクタを使用してシングルトンのインスタンスを生成する。<br>
* Qt 5の場合
もし、デフォルトコンストラクタが存在しない場合は、シングルトンは初期状態ではアクセス不能になるため、<br>
*: 各<code>QQmlEngine</code>クラスは、その型に最初にアクセスした時、その型のデフォルトコンストラクタを使用してシングルトンのインスタンスを生成する。
<code>qmlRegisterSingletonType</code>関数に特定のファクトリー関数を指定する、または、<br>
*: もし、デフォルトコンストラクタが存在しない場合は、シングルトンは初期状態ではアクセス不能になるため、以下に示す記述を行う。
<code>qmlRegisterSingletonInstance</code>関数に同じクラスで同じ型の名前空間とバージョンの特定のインスタンスを指定して呼び出すことにより、オーバーライドすることができる。<br>
** <code>qmlRegisterSingletonType</code>関数に特定のファクトリー関数を指定する。
** <code>qmlRegisterSingletonInstance</code>関数に同じクラスで同じ型の名前空間とバージョンの特定のインスタンスを指定して呼び出すことにより、オーバーライドする。
<br>
<br>
<u>Qt 6の場合</u>、デフォルトでは、各<code>QQmlEngine</code>クラスは、その型に最初にアクセスした時、その型のデフォルトコンストラクタ、または、<br>
* Qt 6の場合
静的ファクトリー関数(<code>T *create(QQmlEngine*, QJSEngine*)</code>)のいずれかを使用して、シングルトンのインスタンスを生成しようとする。<br>
*: 以下に示すタイミングで、シングルトンのインスタンスが生成される。
もし、両方が存在して、かつ、アクセス可能な場合、デフォルトコンストラクタが優先される。<br>
** 各<code>QQmlEngine</code>クラスは、その型に最初にアクセスした時、その型のデフォルトコンストラクタが使用される。
** デフォルトコンストラクタが存在しない場合は、静的ファクトリー関数(<code>T *create(QQmlEngine*, QJSEngine*)</code>)が使用される。
*: <br>
*: もし、両方が存在して両方アクセス可能な場合は、デフォルトコンストラクタが優先される。
*: <u>ただし、デフォルトコンストラクタも静的ファクトリ関数も存在しない場合は、シングルトンはアクセス不能になることに注意する。</u>
<br>
<br>
デフォルトコンストラクタも静的ファクトリ関数も存在しない場合は、シングルトンはアクセス不能になることに注意する。<br>
==== デフォルトコンストラクタが存在する場合 ====
<br>
デフォルトコンストラクタを持つクラスをシングルトンとして宣言する場合は、<code>QML_SINGLETON</code>マクロを記述する。<br>
デフォルトコンストラクタを持つクラスをシングルトンとして宣言する場合は、<code>QML_SINGLETON</code>マクロを記述するだけである。<br>
<br>
<br>
<syntaxhighlight lang="c++">
<syntaxhighlight lang="c++">
49行目: 59行目:
   
   
  public:
  public:
     // メンバ変数 / メンバ関数, Q_INVOKABLEメソッド等
     // メンバ変数, メンバ関数, Q_INVOKABLEメソッド等
  };
  };
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== 静的ファクトリー関数が存在する場合 ====
シングルトンクラスがデフォルトで構築不可であり修正可能な場合は、アクセス可能にするため、静的ファクトリー関数を追加する。<br>
シングルトンクラスがデフォルトで構築不可であり修正可能な場合は、アクセス可能にするため、静的ファクトリー関数を追加する。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
76行目: 87行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
シングルトンクラスが変更不可で、デフォルトコンストラクタや静的ファクトリー関数が存在しない場合、QML_FOREIGNラッパーを使用して、静的ファクトリー関数を定義することが可能である。<br>
==== 両方存在しない場合 ====
シングルトンクラスが変更不可で、デフォルトコンストラクタや静的ファクトリー関数が存在しない場合、<br>
QML_FOREIGNラッパーを使用して、静的ファクトリー関数を定義することが可能である。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  struct SingletonForeign
  struct SingletonForeign