Qtの基礎 - TOML

2024年9月18日 (水) 01:21時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == Qtには組み込みのTOMLパーサーが存在しないため、サードパーティ製ライブラリを使用する必要がある。<br> <br><br> == 同期処理 == ==== TOMLの読み込み ==== 以下の例では、toml++ライブラリを使用して、TOMLファイルを読み込んでいる。<br> toml++ライブラリを使用する場合は、プロジェクトにtoml++ライブラリをリンクする必要がある。<br> <br> <syntaxhig…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

概要

Qtには組み込みのTOMLパーサーが存在しないため、サードパーティ製ライブラリを使用する必要がある。


同期処理

TOMLの読み込み

以下の例では、toml++ライブラリを使用して、TOMLファイルを読み込んでいる。
toml++ライブラリを使用する場合は、プロジェクトにtoml++ライブラリをリンクする必要がある。

 #include <QFile>
 #include <QTextStream>
 #include <stdexcept>
 #include <toml++/toml.h>
 
 class TomlHandler
 {
 public:
    TomlHandler() = default;
 
    // TOMLファイルを読み込む
    toml::table readToml(const QString &filename)
    {
       try {
          return toml::parse_file(filename.toStdString());
       }
       catch (const toml::parse_error &err) {
          throw std::runtime_error(QString("TOMLファイルの解析エラー: %1").arg(err.description().c_str()).toStdString());
       }
    }
 
    // TOMLデータから特定の値を取得 (テンプレート関数)
    template<typename T>
    T getValue(const toml::table &data, const QString &key)
    {
       try {
          return data[key.toStdString()].value<T>();
       }
       catch (const toml::type_error &err) {
          throw std::runtime_error(QString("値の取得エラー: %1").arg(err.what()).toStdString());
       }
    }
 };


以下の例では、上記のクラスを使用してTOMLファイルを読み込んでいる。

 #include <QDebug>
 #include "TomlHandler.h"
 
 int main()
 {
    TomlHandler handler;
 
    try {
       // TOMLファイルを読み込む
       auto data = handler.readToml("config.toml");
 
       // 値を取得する
       QString name = handler.getValue<QString>(data, "name");
       int age = handler.getValue<int>(data, "age");
 
       qDebug() << "Name:" << name;
       qDebug() << "Age:" << age;
    }
    catch (const std::exception &e) {
       qCritical() << "エラー: " << e.what();
       return -1;
    }
 
    return 0;
 }


TOMLファイルの書き込み

以下の例では、toml++ライブラリを使用して、TOMLファイルを書き込んでいる。
toml++ライブラリを使用する場合は、プロジェクトにtoml++ライブラリをリンクする必要がある。

 #include <QFile>
 #include <QTextStream>
 #include <stdexcept>
 #include <toml++/toml.h>
 
 class TomlHandler
 {
 public:
    TomlHandler() = default;
 
    // TOMLファイルを読み込む
    toml::table readToml(const QString &filename)
    {
       try {
          return toml::parse_file(filename.toStdString());
       }
       catch (const toml::parse_error &err) {
          throw std::runtime_error(QString("TOMLファイルの解析エラー: %1").arg(err.description().c_str()).toStdString());
       }
    }
 
    // TOMLデータをファイルに書き込む
    void writeToml(const QString &filename, const toml::table &data)
    {
       QFile file(filename);
       if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
          throw std::runtime_error(QString("ファイルオープンエラー: %1").arg(filename).toStdString());
       }
 
       QTextStream out(&file);
       out << QString::fromStdString(toml::toml_formatter(data).format());
 
       file.close();
    }
 
    // TOMLデータから特定の値を取得 (テンプレート関数)
    template<typename T>
    T getValue(const toml::table &data, const QString &key)
    {
       try {
          return data[key.toStdString()].value<T>();
       }
       catch (const toml::type_error &err) {
          throw std::runtime_error(QString("値の取得エラー: %1").arg(err.what()).toStdString());
       }
    }
 
    // TOMLデータに値を設定する (テンプレート関数)
    template<typename T>
    void setValue(toml::table &data, const QString &key, const T &value)
    {
       data[key.toStdString()] = value;
    }
 };


以下の例では、上記のクラスを使用してTOMLファイルを書き込んでいる。

 #include <QDebug>
 #include "TomlHandler.h"
 
 int main()
 {
    TomlHandler handler;
 
    try {
       // TOMLファイルを読み込む
       auto data = handler.readToml("config.toml");
 
       // 値を取得
       QString name = handler.getValue<QString>(data, "name");
       int age = handler.getValue<int>(data, "age");
 
       qDebug() << "Name:" << name;
       qDebug() << "Age:" << age;
 
       // 値を設定
       handler.setValue(data, "location", "Tokyo");
 
       // 変更したデータを書き込む
       handler.writeToml("config_updated.toml", data);
    }
    catch (const std::exception &e) {
       qCritical() << "エラー: " << e.what();
       return -1;
    }
 
    return 0;
 }