細 文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag… |
|||
| (同じ利用者による、間の1版が非表示) | |||
| 179行目: | 179行目: | ||
以下に、設定ファイル(Settings.ini)の内容を示す。<br> | 以下に、設定ファイル(Settings.ini)の内容を示す。<br> | ||
左上位置(46, 15)、画面サイズ(800x600)、最大化(false)、最少幅(400)、画面のタイトルが"サンプル画面"の場合である。<br> | 左上位置(46, 15)、画面サイズ(800x600)、最大化(false)、最少幅(400)、画面のタイトルが"サンプル画面"の場合である。<br> | ||
<syntaxhighlight lang="ini"> | |||
[MainWindow] | [MainWindow] | ||
pos=@Point(46 15) | pos=@Point(46 15) | ||
| 185行目: | 186行目: | ||
miniwid=400 | miniwid=400 | ||
title=\x30b5\x30f3\x30d7\x30eb\x753b\x9762 | title=\x30b5\x30f3\x30d7\x30eb\x753b\x9762 | ||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
== 複数の設定ファイルを扱う == | |||
以下の例では、異なる目的や範囲のための複数の設定ファイルを管理している。<br> | |||
グローバル設定、ユーザ固有の設定、プロジェクト固有の設定を別々のファイルで扱っている。<br> | |||
<br> | |||
また、各設定ファイルの書き込み権限を確認して、エラーが発生した場合にはログを出力する。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QSettings> | |||
#include <QFileInfo> | |||
#include <QDebug> | |||
// QSettingsオブジェクトのステータスを確認 | |||
void handleSettingsError(const QSettings &settings, const QString &operation) | |||
{ | |||
if (settings.status() != QSettings::NoError) { | |||
qCritical() << "Error occurred during" << operation << ": " << settings.status(); | |||
} | |||
} | |||
int main() | |||
{ | |||
QSettings globalSettings("MyCompany", "MyApp"); | |||
globalSettings.setValue("language", "Japanese"); | |||
handleSettingsError(globalSettings, "global settings"); | |||
QSettings userSettings("MyCompany", "MyApp", QSettings::IniFormat, QSettings::UserScope); | |||
userSettings.setValue("theme", "dark"); | |||
handleSettingsError(userSettings, "user settings"); | |||
QString projectConfigPath = "./project_config.ini"; | |||
QFileInfo fileInfo(projectConfigPath); | |||
if (!fileInfo.isWritable()) { | |||
qWarning() << "Project config file is not writable:" << projectConfigPath; | |||
} | |||
else { | |||
QSettings projectSettings(projectConfigPath, QSettings::IniFormat); | |||
projectSettings.setValue("projectName", "MyProject"); | |||
handleSettingsError(projectSettings, "project settings"); | |||
} | |||
qDebug() << "Global language:" << globalSettings.value("language", "Default").toString(); | |||
qDebug() << "User theme:" << userSettings.value("theme", "Default").toString(); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== 階層的な設定構造を使用する == | |||
以下の例では、設定をツリー構造で整理して、<code>/</code>を使用してキーを階層化している。<br> | |||
ウインドウのサイズや位置、ユーザ情報等をを階層的に保存している。<br> | |||
<br> | |||
グループを使用して関連する設定にアクセスする手順も示している。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QSettings> | |||
#include <QDebug> | |||
// QSettingsオブジェクトのステータスを確認 | |||
void handleSettingsError(const QSettings &settings, const QString &operation) | |||
{ | |||
if (settings.status() != QSettings::NoError) { | |||
qCritical() << "Error occurred during" << operation << ": " << settings.status(); | |||
} | |||
} | |||
int main() | |||
{ | |||
QSettings settings("MyCompany", "MyApp"); | |||
settings.setValue("window/size/width", 800); | |||
settings.setValue("window/size/height", 600); | |||
settings.setValue("window/position/x", 100); | |||
settings.setValue("window/position/y", 100); | |||
settings.setValue("user/name", "John Doe"); | |||
settings.setValue("user/email", "john@example.com"); | |||
handleSettingsError(settings, "setting values"); | |||
// QVariantオブジェクトの有効性を確認 | |||
QVariant widthValue = settings.value("window/size/width"); | |||
if (!widthValue.isValid()) { | |||
qWarning() << "Failed to read window width"; | |||
} | |||
else { | |||
qDebug() << "Window width:" << widthValue.toInt(); | |||
} | |||
// QVariantオブジェクトの有効性を確認 | |||
QVariant nameValue = settings.value("user/name"); | |||
if (!nameValue.isValid()) { | |||
qWarning() << "Failed to read user name"; | |||
} | |||
else { | |||
qDebug() << "User name:" << nameValue.toString(); | |||
} | |||
settings.beginGroup("window"); | |||
if (settings.group() != "window") { | |||
qWarning() << "Failed to begin group 'window'"; | |||
} | |||
else { | |||
qDebug() << "Window size:" << settings.value("size/width").toInt() << "x" | |||
<< settings.value("size/height").toInt(); | |||
} | |||
settings.endGroup(); | |||
handleSettingsError(settings, "reading values"); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== 一時的な設定を管理する == | |||
以下の例では、メモリ内の設定を使用して、永続的なファイルを作成せずに一時的な設定を扱っている。<br> | |||
これは、<code>QSettings::setDefaultFormat</code>メソッドおよび<code>QSettings::setPath</code>メソッドを使用してメモリ内設定を構成している。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QSettings> | |||
#include <QDebug> | |||
// QSettingsオブジェクトのステータスを確認 | |||
void handleSettingsError(const QSettings &settings, const QString &operation) | |||
{ | |||
if (settings.status() != QSettings::NoError) { | |||
qCritical() << "Error occurred during" << operation << ": " << settings.status(); | |||
} | |||
} | |||
int main() | |||
{ | |||
if (!QSettings::setDefaultFormat(QSettings::IniFormat)) { | |||
qCritical() << "Failed to set default format to INI"; | |||
return -1; | |||
} | |||
if (!QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, QSettings::defaultFormat())) { | |||
qCritical() << "Failed to set path for temporary settings"; | |||
return -1; | |||
} | |||
QSettings settings; | |||
settings.setValue("tempSetting", "This is a temporary setting"); | |||
handleSettingsError(settings, "setting temporary value"); | |||
// QVariantオブジェクトの有効性を確認 | |||
QVariant tempValue = settings.value("tempSetting"); | |||
if (!tempValue.isValid()) { | |||
qWarning() << "Failed to read temporary setting"; | |||
} | |||
else { | |||
qDebug() << "Temp setting:" << tempValue.toString(); | |||
} | |||
handleSettingsError(settings, "reading temporary value"); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== 設定のインポートとエクスポート == | |||
以下の例では、設定をファイルにエクスポートして、そのファイルから設定をインポートする機能を提供している。<br> | |||
<br> | |||
エクスポート時には全ての設定をテキストファイルに書き出し、インポート時にはファイルを読み込んで設定を復元している。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QSettings> | |||
#include <QFile> | |||
#include <QTextStream> | |||
#include <QDebug> | |||
// QSettingsオブジェクトのステータスを確認 | |||
void handleSettingsError(const QSettings &settings, const QString &operation) | |||
{ | |||
if (settings.status() != QSettings::NoError) { | |||
qCritical() << "Error occurred during" << operation << ": " << settings.status(); | |||
} | |||
} | |||
bool exportSettings(const QString &filename) | |||
{ | |||
QSettings settings("MyCompany", "MyApp"); | |||
QFile file(filename); | |||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { | |||
qCritical() << "Failed to open file for writing:" << filename; | |||
return false; | |||
} | |||
QTextStream out(&file); | |||
for (const QString& key : settings.allKeys()) { | |||
out << key << "=" << settings.value(key).toString() << "\n"; | |||
} | |||
file.close(); | |||
qDebug() << "Settings exported to" << filename; | |||
return true; | |||
} | |||
bool importSettings(const QString &filename) | |||
{ | |||
QSettings settings("MyCompany", "MyApp"); | |||
QFile file(filename); | |||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { | |||
qCritical() << "Failed to open file for reading:" << filename; | |||
return false; | |||
} | |||
QTextStream in(&file); | |||
while (!in.atEnd()) { | |||
QString line = in.readLine(); | |||
QStringList parts = line.split('='); | |||
if (parts.size() == 2) { | |||
settings.setValue(parts[0].trimmed(), parts[1].trimmed()); | |||
} | |||
else { | |||
qWarning() << "Invalid line in settings file:" << line; | |||
} | |||
} | |||
file.close(); | |||
qDebug() << "Settings imported from" << filename; | |||
handleSettingsError(settings, "importing settings"); | |||
return true; | |||
} | |||
int main() | |||
{ | |||
QSettings settings("MyCompany", "MyApp"); | |||
settings.setValue("setting1", "value1"); | |||
settings.setValue("setting2", "value2"); | |||
handleSettingsError(settings, "setting initial values"); | |||
if (!exportSettings("settings_export.txt")) { | |||
qCritical() << "Failed to export settings"; | |||
return -1; | |||
} | |||
settings.clear(); | |||
if (!importSettings("settings_export.txt")) { | |||
qCritical() << "Failed to import settings"; | |||
return -1; | |||
} | |||
QVariant setting1 = settings.value("setting1"); | |||
QVariant setting2 = settings.value("setting2"); | |||
// QVariantオブジェクトの有効性を確認 | |||
if (!setting1.isValid() || !setting2.isValid()) { | |||
qWarning() << "Failed to read imported settings"; | |||
} | |||
else { | |||
qDebug() << "Imported setting1:" << setting1.toString(); | |||
qDebug() << "Imported setting2:" << setting2.toString(); | |||
} | |||
handleSettingsError(settings, "reading imported settings"); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== クロスプラットフォームで一貫した設定管理を行う == | |||
以下の例では、Windowsではレジストリ、その他のプラットフォームではINIファイルを使用する等、OSに応じて適切な設定ストレージを選択している。<br> | |||
同時に、プラットフォーム固有の設定とINIファイルベースの設定の両方を扱えるようにしている。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QSettings> | |||
#include <QDebug> | |||
// QSettingsオブジェクトのステータスを確認 | |||
void handleSettingsError(const QSettings &settings, const QString &operation) | |||
{ | |||
if (settings.status() != QSettings::NoError) { | |||
qCritical() << "Error occurred during" << operation << ": " << settings.status(); | |||
} | |||
} | |||
int main() | |||
{ | |||
QSettings nativeSettings("MyCompany", "MyApp"); | |||
nativeSettings.setValue("nativeSetting", "This is a native setting"); | |||
handleSettingsError(nativeSettings, "setting native value"); | |||
QSettings iniSettings("settings.ini", QSettings::IniFormat); | |||
iniSettings.setValue("iniSetting", "This is an INI setting"); | |||
handleSettingsError(iniSettings, "setting INI value"); | |||
QSettings* settings; | |||
#ifdef Q_OS_WIN | |||
settings = &nativeSettings; // Windowsではレジストリを使用 | |||
#else | |||
settings = &iniSettings; // その他のプラットフォームではINIファイルを使用 | |||
#endif | |||
settings->setValue("platformSetting", "This is a platform-specific setting"); | |||
handleSettingsError(*settings, "setting platform-specific value"); | |||
QVariant nativeValue = nativeSettings.value("nativeSetting"); | |||
QVariant iniValue = iniSettings.value("iniSetting"); | |||
QVariant platformValue = settings->value("platformSetting"); | |||
// QVariantオブジェクトの有効性を確認 | |||
if (!nativeValue.isValid()) { | |||
qWarning() << "Failed to read native setting"; | |||
} | |||
else { | |||
qDebug() << "Native setting:" << nativeValue.toString(); | |||
} | |||
if (!iniValue.isValid()) { | |||
qWarning() << "Failed to read INI setting"; | |||
} | |||
else { | |||
qDebug() << "INI setting:" << iniValue.toString(); | |||
} | |||
if (!platformValue.isValid()) { | |||
qWarning() << "Failed to read platform-specific setting"; | |||
} | |||
else { | |||
qDebug() << "Platform-specific setting:" << platformValue.toString(); | |||
} | |||
handleSettingsError(*settings, "reading values"); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Qt]] | [[カテゴリ:Qt]] | ||