12,982
回編集
171行目: | 171行目: | ||
<br><br> | <br><br> | ||
== | == 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> |