[Qt-users:369] Re: QSettingsのxml形式出力について

Shingo Ishida hermit4loop @ gmail.com
2014年 12月 10日 (水) 20:47:14 JST


hermit4です。Qt Advent Calendarを書いているみなさん、進捗どうですか?
Qt 5.4もでて、今夜以降の人から確かめなきゃならない事増えてたりして・・・。

閑話休題。ご質問の件ですが、QSettingsにはコンストラクタがいくつかあります。このうち、ファイル名を指定しないコンストラクタは、OSと他の引数依存でファイル保存先が変化します。

保存先やエラーが無いかを確認するため、以下を試してみる事をおすすめします。

・ QSettings::fileName()の結果を表示してみる
 これで保存先のパスが表示されるはずです。

・QSettings::status() の結果を確認する
 パーミッション等でエラーになった場合はこれで確認ができるかと思います。

・QSettings( const QString & fileName, Format format, QObject * parent
= 0 )のコンストラクタを使う
 fileNameをフルパス指定で書くと任意のファイルに書き込めるかと思います。

以上、ご参考までに。


2014年12月10日 19:00 小澤和広 <kazuhiro.ozawa @ gmail.com>:
> 小澤と申します。
> 初めて投稿します。
>
> 表題の件で、質問させて頂きます。
> Qt経験はありますが、ブランクが2年あったため、感覚が掴めておりません。
> 申し訳ありませんが、ご教示ください。
>
> bool writeSettingsXml(QIODevice &device, const QMap<QString, QVariant> &map)
>
> {
>
>     QXmlStreamWriter xmlWriter(&device);
>
>
>     xmlWriter.setAutoFormatting(true);
>
>     xmlWriter.writeStartDocument();
>
>     xmlWriter.writeStartElement("Settings");
>
>
>     QStringList prev_elements;
>
>     QSettings::SettingsMap::ConstIterator map_i;
>
>
>     // Alle Elemente der Map durchlaufen
>
>     for (map_i = map.begin(); map_i != map.end(); map_i++) {
>
>
>         QStringList elements = map_i.key().split("/");
>
>
>         int x = 0;
>
>         // Zu schließende Elemente ermitteln
>
>         while(x < prev_elements.size() && elements.at(x) ==
> prev_elements.at(x)) {
>
>             x++;
>
>         }
>
>
>         // Elemente schließen
>
>         for(int i = prev_elements.size() - 1; i >= x; i--) {
>
>             xmlWriter.writeEndElement();
>
>         }
>
>
>         // Elemente öffnen
>
>         for (int i = x; i < elements.size(); i++) {
>
>             xmlWriter.writeStartElement(elements.at(i));
>
>         }
>
>
>         // Wert eintragen
>
>         xmlWriter.writeCharacters(map_i.value().toString());
>
>
>         prev_elements = elements;
>
>     }
>
>
>     // Noch offene Elemente schließen
>
>     for(int i = 0; i < prev_elements.size(); i++) {
>
>         xmlWriter.writeEndElement();
>
>     }
>
>
>     xmlWriter.writeEndElement();
>
>     xmlWriter.writeEndDocument();
>
>
>     return true;
>
> }
>
>
> const QSettings::Format XmlFormat = QSettings::registerFormat("xml",
> &readSettingsXml, &writeSettingsXml);
>
> QSettings xml(XmlFormat, QSettings::UserScope, "organization",
> "application");
>
>
> xml.setValue("Place/Latitude", ui->lineLatitude->text().toFloat());
>
> xml.setValue("Place/Latitude", ui->lineLongitude->text().toFloat());
>
>
> 上記のように処理をしたところ、writeSettingsXml関数内はXML形式に正常出力させているようですが、
>
> 実際のファイルが見当たりません。
>
> 正常に書けなかった場合でも、0バイトのファイルぐらいはあってもおかしくない気がするのですが、
>
> なぜ書かれないのでしょうか?
>
>
>
> 以上、よろしくお願いします。
>
>
>
> _______________________________________________
> Qt-users mailing list
> Qt-users @ qt-users.jp
> http://qt-users.jp/mailman/listinfo/qt-users
>


Qt-users メーリングリストの案内