文字列「__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]]