小澤と申します。 初めて投稿します。
表題の件で、質問させて頂きます。 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は始めたばかりで、Xmlライターはまだ使ったことないのですが、一般 的なファイル保存の時、たまにカレント・フォルダ違いでファイルを見失うこと があります。
もしかして、保存先のパスを相対パスで指定されているということはないでし ょうか? そして、カレントが思わぬフォルダになっていると保存した筈のファ イルが保存されないように見えてしまいます。(カレントって必ずしもexeのある フォルダというわけではないですので。) 一度、絶対パスで保存先ファイルを指定してみると良いかもです。 既に絶対パス指定されていたら、ハズレですので忘れてくださいな。
xmlライターに関しては回答できなくてごめんなさい。
以上
小澤さん、初めまして。 山本(@Atsushi4)です。
QSettingsはデフォルトの出力先がApplicationフォルダ?になっているようです。 ご提示のコードを実行してみたら出力先が C:\Users[username]\AppData\Roaming\organization\application.xml になっていました。
一度確認してみてください。
的外れでしたらゴメンナサイ。
ちなみにwriteSettingsXmlにこんなコードを埋め込んで確認しました。(C++11以降)
auto file = dynamic_cast<QFile*>(&device); if (file != 0) { qDebug() << QFileInfo(file->fileName()).absoluteFilePath(); }
2014年12月10日 20:17 Chironian chironian123@gmail.com:
小澤さん、初めまして。ケイロニアンです。
私もQtは始めたばかりで、Xmlライターはまだ使ったことないのですが、一般 的なファイル保存の時、たまにカレント・フォルダ違いでファイルを見失うこと があります。
もしかして、保存先のパスを相対パスで指定されているということはないでし ょうか? そして、カレントが思わぬフォルダになっていると保存した筈のファ イルが保存されないように見えてしまいます。(カレントって必ずしもexeのある フォルダというわけではないですので。) 一度、絶対パスで保存先ファイルを指定してみると良いかもです。 既に絶対パス指定されていたら、ハズレですので忘れてくださいな。
xmlライターに関しては回答できなくてごめんなさい。
以上 _______________________________________________ Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users
ごめんなさい、hermit4さんのメールに詳しく書いてましたね。。。 iPhoneでは文字化けして読めなかったのよー(言い訳)
どうも失礼しましたです。
2014年12月10日 22:07 YAMAMOTO Atsushi atsushi.yamyam@gmail.com:
小澤さん、初めまして。 山本(@Atsushi4)です。
QSettingsはデフォルトの出力先がApplicationフォルダ?になっているようです。 ご提示のコードを実行してみたら出力先が C:\Users[username]\AppData\Roaming\organization\application.xml になっていました。
一度確認してみてください。
的外れでしたらゴメンナサイ。
ちなみにwriteSettingsXmlにこんなコードを埋め込んで確認しました。(C++11以降)
auto file = dynamic_cast<QFile*>(&device); if (file != 0) { qDebug() << QFileInfo(file->fileName()).absoluteFilePath(); }
2014年12月10日 20:17 Chironian chironian123@gmail.com:
小澤さん、初めまして。ケイロニアンです。
私もQtは始めたばかりで、Xmlライターはまだ使ったことないのですが、一般 的なファイル保存の時、たまにカレント・フォルダ違いでファイルを見失うこと があります。
もしかして、保存先のパスを相対パスで指定されているということはないでし ょうか? そして、カレントが思わぬフォルダになっていると保存した筈のファ イルが保存されないように見えてしまいます。(カレントって必ずしもexeのある フォルダというわけではないですので。) 一度、絶対パスで保存先ファイルを指定してみると良いかもです。 既に絶対パス指定されていたら、ハズレですので忘れてくださいな。
xmlライターに関しては回答できなくてごめんなさい。
以上 _______________________________________________ Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users
-- □■━━━━━━━━━━━━━━━━━ 山本 篤史 e-mail: atsushi.yamyam@gmail.com ━━━━━━━━━━━━━━━━━■□
TO:ケイロニアンさん、hermit4さん、山本さん
早速の回答ありがとうございます。 QSettingsの出力先を取ることが出来るのはヘルプを見ましたが 読み取れませんでした。不覚です。
色々なところに質問をしましたが、ここが一番回答が早かったです。 今度躓いたときもよろしくお願いします。
小澤
2014年12月10日 23:03 YAMAMOTO Atsushi atsushi.yamyam@gmail.com:
ごめんなさい、hermit4さんのメールに詳しく書いてましたね。。。 iPhoneでは文字化けして読めなかったのよー(言い訳)
どうも失礼しましたです。
2014年12月10日 22:07 YAMAMOTO Atsushi atsushi.yamyam@gmail.com:
小澤さん、初めまして。 山本(@Atsushi4)です。
QSettingsはデフォルトの出力先がApplicationフォルダ?になっているようです。 ご提示のコードを実行してみたら出力先が C:\Users[username]\AppData\Roaming\organization\application.xml になっていました。
一度確認してみてください。
的外れでしたらゴメンナサイ。
ちなみにwriteSettingsXmlにこんなコードを埋め込んで確認しました。(C++11以降)
auto file = dynamic_cast<QFile*>(&device); if (file != 0) { qDebug() << QFileInfo(file->fileName()).absoluteFilePath(); }
2014年12月10日 20:17 Chironian chironian123@gmail.com:
小澤さん、初めまして。ケイロニアンです。
私もQtは始めたばかりで、Xmlライターはまだ使ったことないのですが、一般 的なファイル保存の時、たまにカレント・フォルダ違いでファイルを見失うこと があります。
もしかして、保存先のパスを相対パスで指定されているということはないでし ょうか? そして、カレントが思わぬフォルダになっていると保存した筈のファ イルが保存されないように見えてしまいます。(カレントって必ずしもexeのある フォルダというわけではないですので。) 一度、絶対パスで保存先ファイルを指定してみると良いかもです。 既に絶対パス指定されていたら、ハズレですので忘れてくださいな。
xmlライターに関しては回答できなくてごめんなさい。
以上 _______________________________________________ Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users
-- □■━━━━━━━━━━━━━━━━━ 山本 篤史 e-mail: atsushi.yamyam@gmail.com ━━━━━━━━━━━━━━━━━■□
-- □■━━━━━━━━━━━━━━━━━ 山本 篤史 e-mail: atsushi.yamyam@gmail.com ━━━━━━━━━━━━━━━━━■□ _______________________________________________ Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users
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