Using QSettings on Mac crashes on launch. Is there a fix?
-
You are using QSettings in a global variable. Move the initialisation inside the main().
Looks like you are using a statically linked Qt, right ? Your QSettings is a global variable, QSettings implementation itself rely on other global variables. The order of initialisation of global variables is undefined.
What could work, from worst to best:- shuffle the link order around to get QSettings globals initialised first (that would be a very fragile fix)
- link Qt as a shared library, shared lib would be loaded and initialised before your code.
- Don't build a QSettings as a global, replace it with a QSettings * and build it in main().
@sandy.martel23 Thanks for your response. I'm going to see if the patch in the bug report fixes the error. If not this will be what I try next :) Just a quick question about it though (if that's ok) :)
At the moment I've got globalsettings.cpp. In there is where I have 'QSettings settings' and then I refer to this object in some static functions which are in globalsettings.cpp. Example below:
// globalsettings.cpp #include <QSettings> #include "globalsettings.h" // Initialise some variables from globalsettings.h. QSettings settings; void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h. { settings.setValue("dayNumber", day); }
In main.cpp I define the information needed for QCoreApplication which is why I haven't included app name etc as parameters in the QSettings object.
So my question, is, where should I move the initialisation of the QSettings object, as unless I've misunderstood (possible because I'm a newbie), I can't have a main loop in globalsettings.cpp, and if I put it in the main loop in main.cpp, it won't be accessible. As I said, I may have totally misunderstood but would appreciate any clarification :)
-
You don't need a global QSettings. Just create one when you need to either read or write a setting and be done with it.
-
You don't need a global QSettings. Just create one when you need to either read or write a setting and be done with it.
-
The bug report was about a corrupted file which doesn't match your use case.
All in all, since you have already built Qt with the patch applied, did you also test it for your use case ?
-
The bug report was about a corrupted file which doesn't match your use case.
All in all, since you have already built Qt with the patch applied, did you also test it for your use case ?
-
Still building ? What machine do you have ? What options did you pass to configure ?
-
If you only need the core modules for your application, just build qtbase, that will save you lots of times
-
If you only need the core modules for your application, just build qtbase, that will save you lots of times
-
You don't need a global QSettings. Just create one when you need to either read or write a setting and be done with it.
@Crossy said:
QSettings settings;
void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
{
settings.setValue("dayNumber", day);
}SGaist is right, the code should look like this:
void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
{
QSettings settings; // <-- NOT a global
settings.setValue("dayNumber", day);
}This is much better than your current implementation, since the destructor of QSettings will save/sync the preferences right away.
And if the global is really what is causing the problem, that would fix it. -
@Crossy said:
QSettings settings;
void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
{
settings.setValue("dayNumber", day);
}SGaist is right, the code should look like this:
void GlobalSettings::saveSetting(int day) // This function is defined statically in globalsettings.h.
{
QSettings settings; // <-- NOT a global
settings.setValue("dayNumber", day);
}This is much better than your current implementation, since the destructor of QSettings will save/sync the preferences right away.
And if the global is really what is causing the problem, that would fix it.@sandy.martel23 Thanks for your help :) It was the global causing the problem - after changing it to how you and SGaist suggested, it has worked :) Thank you!
-
Good !
Since everything is working now, please mark the thread as solved using the "Topic Tool" button so that other forum users may know a solution has been found :)