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

ナビゲーションに移動 検索に移動
171行目: 171行目:
<br><br>
<br><br>


== : 複数のQMLから同一のシングルトンクラスを参照する ==
== QML_SINGLETONを使用する場合 ==
==== 使用例 1 ====
以下の例では、QML_SINGLETONマクロを使用してConfigServiceをシングルトンクラスとして定義して、アプリケーションのテーマとダークモードの設定を管理している。<br>
<br>
C++側では、main関数内でqmlRegisterSingletonType関数を使用して、このシングルトンをQMLエンジンに登録している。<br>
<br>
QML側では、ConfigServiceシングルトンを直接使用して、現在の設定の表示やユーザの操作に応じて設定を変更している。<br>
これにより、アプリケーション全体で一貫した設定管理が可能になり、C++とQML間でシームレスにデータを共有することができる。<br>
<br>
シングルトンの使用により、コードの重複を避けてアプリケーション全体で一貫したステート管理を実現できる。<br>
<br>
<syntaxhighlight lang="c++">
// ConfigService.hファイル
#include <QObject>
#include <QQmlEngine>
#include <QSettings>
class ConfigService : public QObject
{
    Q_OBJECT
    QML_SINGLETON
    Q_PROPERTY(QString theme READ theme WRITE setTheme NOTIFY themeChanged)
    Q_PROPERTY(bool darkMode READ darkMode WRITE setDarkMode NOTIFY darkModeChanged)
private:
    QString m_theme;
    bool    m_darkMode;
public:
    explicit ConfigService(QObject *parent) : QObject(parent), m_theme("Default"), m_darkMode(false)
    {
      loadSettings();
    }
    QString theme() const
    {
      return m_theme;
    }
    void setTheme(const QString &theme)
    {
      if (m_theme != theme) {
          m_theme = theme;
          emit themeChanged();
      }
    }
    bool darkMode() const
    {
      return m_darkMode;
    }
    void setDarkMode(bool darkMode)
    {
      if (m_darkMode != darkMode) {
          m_darkMode = darkMode;
          emit darkModeChanged();
      }
    }
    Q_INVOKABLE void saveSettings()
    {
      QSettings settings("MyCompany", "MyApp");
      settings.setValue("theme", m_theme);
      settings.setValue("darkMode", m_darkMode);
    }
    Q_INVOKABLE void loadSettings()
    {
      QSettings settings("MyCompany", "MyApp");
      setTheme(settings.value("theme", "Default").toString());
      setDarkMode(settings.value("darkMode", false).toBool());
    }
signals:
    void themeChanged();
    void darkModeChanged();
};
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// main.cppファイル
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "ConfigService.h"
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    qmlRegisterSingletonType<ConfigService>("com.mycompany.configservice", 1, 0, "ConfigService",
      [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
          Q_UNUSED(engine)
          Q_UNUSED(scriptEngine)
          return new ConfigService();
      });
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="qml">
// main.qmlファイル
import QtQuick
import QtQuick.Controls
import com.mycompany.configservice 1.0
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Config Service Example")
    Column {
      anchors.centerIn: parent
      spacing: 10
      Text {
          text: "Current Theme: " + ConfigService.theme
      }
      Text {
          text: "Dark Mode: " + (ConfigService.darkMode ? "On" : "Off")
      }
      Button {
          text: "Toggle Dark Mode"
          onClicked: {
            ConfigService.darkMode = !ConfigService.darkMode
            ConfigService.saveSettings()
          }
      }
      ComboBox {
          model: ["Default", "Light", "Dark"]
          onCurrentTextChanged: {
            ConfigService.theme = currentText
            ConfigService.saveSettings()
          }
      }
    }
    Component.onCompleted: {
      ConfigService.loadSettings()
    }
}
</syntaxhighlight>
<br><br>
 
== QML_SINGLETONを使用しない場合 ==
==== 使用例: 複数のQMLから同一のシングルトンクラスを参照する ====
以下の例では、2つの画面 (Screen1.qmlとScreen2.qml) から同一のシングルトンクラスを参照する。<br>
以下の例では、2つの画面 (Screen1.qmlとScreen2.qml) から同一のシングルトンクラスを参照する。<br>
<br>
<br>

案内メニュー