[Interest] Write QSettings to a QString in INI format
Murphy, Sean
smurphy at walbro.com
Sat Oct 26 16:51:57 CEST 2019
> This is basically the way to go.
Thanks, although again I'd prefer to not have to do the actual file roundtrip,
but it's not horrible.
> >
> > void MainWindow::writeSettings()
> > {
> > // comment/uncomment the *define* below to switch implementations
> > #define USE_QTEMPORARY_FILE
> >
> > #ifdef USE_QTEMPORARY_FILE
> > // using a QTemporaryFile doesn't seem to work
> > QTemporaryFile tempFile;
> > bool ok = tempFile.open();
> > #else
> > // if instead you use a regular QFile, it works
> > QFile tempFile("tempFile.ini");
> > bool ok = tempFile.open(QIODevice::ReadWrite);
> > #endif
> >
> > if(ok)
> > {
> > qDebug() << "Opened" << tempFile.fileName();
> > } else {
> > qDebug() << "Unable to open" << tempFile.fileName();
> > }
> Call tempFile.fileName() before you call close()! (But close() before you
> instantiate QSettings.)
I'm confused by your statement. Isn't that exactly what I'm doing? I
first open the tempFile:
bool ok = tempFile.open(QIODevice::ReadWrite);
Then I do call fileName() on it, as long as the open succeeded:
if(ok)
{
qDebug() << "Opened" << tempFile.fileName();
}
Then I close it on the following line, and then call the QSettings constructor
with that filename.
> > tempFile.close();
> >
> > QSettings settings(tempFile.fileName(), QSettings::IniFormat);
> > settings.setValue("string", "hello");
> > settings.setValue("int", 2);
> >
> > settings.sync();
> > // using QTemporaryFile always produces an AccessError here
> > qDebug() << settings.status();
> Because QSettings has the file locked. Make sure settings goes out of scope
> before you re-open the file.
I put the qDebug() << settings.status() line back in above (you omitted in your
reply), but the AccessError I'm referring to is a **QSettings** error, not an access
error with the QFile object later as shown output on the above debug line. So at
this point the temporary file on disk contains exactly zero bytes, QSettings never
wrote anything to it when the sync() call was made, and after the sync(), the
QSettings object's status is now QSettings::AccessError. I believe QSettings was
never able to lock the file created by QTemporaryFile - probably because the
QTemporaryFile object is hanging on to the lock so it can remove the file when
the QTemporaryFile goes out of scope?
Sean
This message has been scanned for malware by Forcepoint. www.forcepoint.com
More information about the Interest
mailing list