[Interest] Issue using QSettings INI format on Windows
Henry Skoglund
fromqt at tungware.se
Sat Feb 9 00:16:19 CET 2019
On 2019-02-08 23:56, Murphy, Sean wrote:
>> Hi, just tested your example program in MSVC 2017 Qt 5.12.1 and it fails
>> as well.
>>
>> But a simple fix is just to make sure that the QFile file isn't open at
>> the same time as you write out the settings to it.
>> I.e. in your example program, it suffices to move that first
>> file.close(); up to just before the "// write out via QSettings" comment
>> line is, then it runs flawlessly.
>>
>> But perhaps that's not possible to keep those writes separate in time in
>> your "real" app that your porting?
>
> Thanks for testing!
>
> Yes, I discovered that issue as well, and then forgot to post a follow-up
> here. Where I had trouble, and something I did differently in the real
> app vs. the minimal example, is that the file I was trying to use to write
> the settings to was a QTemporaryFile. I stumbled across the same fix you
> did in the example, but that fix never seemed to work in my real app with a
> QTemporaryFile. After testing, I believe that is because the QSettings
> object is trying to open the associated settings file with write permissions,
> and it isn't able to acquire them. In my example, it was because I already
> had opened the file with write permissions (mistakenly thinking I needed
> to do that before all the QSettings stuff). In my real app, I think that it
> must be because QTemporaryFile holds a lock on the file so it can
> remove it when the QTemporaryFile object goes out of scope, and
> therefore the QSettings object gets an access error because the file is
> already in use.
>
> What I'm actually trying to accomplish is far more simple: I don't actually
> want an INI file, I just want to get data that I've put into a QSettings object
> written to a QString, in the INI file format. I couldn't see any other way to
> do that than to write it out to a file, then read the file contents back into
> a QString. So if you see a simpler solution for that, I'm open to suggestions!
>
Well there's always QSettings::registerFormat (
https://doc.qt.io/qt-5/qsettings.html#registerFormat )
Haven't tried it myself but it will give you a QSettings::SettingsMap
which means you'll still have to serialize out it yourself to a QString,
but at least you can get rid of the file i/o by ignoring those
QIODevices that QSettings hands over. /Rgrds Henry
More information about the Interest
mailing list