Settings and macOS. Impossible to create a ini file...
-
In fact, my code is a bit more complicated. I'm calling a getSaveFileName box just before. Could this have an effect?
QString file = QFileDialog::getSaveFileName( this, tr("Save a configuration file..."), QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation), "configuration file (*.ini)"); QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, file); QSettings settings(file, QSettings::IniFormat); settings.beginGroup("Data"); settings.setValue("a1", 0.0); settings.setValue("a2", 0.0); settings.endGroup(); return settings.status();
-
In fact, my code is a bit more complicated. I'm calling a getSaveFileName box just before. Could this have an effect?
QString file = QFileDialog::getSaveFileName( this, tr("Save a configuration file..."), QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation), "configuration file (*.ini)"); QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, file); QSettings settings(file, QSettings::IniFormat); settings.beginGroup("Data"); settings.setValue("a1", 0.0); settings.setValue("a2", 0.0); settings.endGroup(); return settings.status();
@Francky033 said in Settings and macOS. Impossible to create a ini file...:
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, file);
Shouldn't you actually provide a path to a folder, not to a file? So, using setPath you set the folder where ini files should be stored, then if you create a QSettings instance you pass the name of an ini file which then stored in the folder specified by setPath.
-
I modified my code this way but it still doesn't work...
QString file = QFileDialog::getSaveFileName( this, tr("Save a configuration file..."), QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation), "configuration file (*.ini)"); QString d = file.left(file .lastIndexOf("/")); QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, d); QSettings settings(file, QSettings::IniFormat); settings.beginGroup("Data"); settings.setValue("a1", 0.0); settings.setValue("a2", 0.0); settings.endGroup(); return settings.status();
-
I modified my code this way but it still doesn't work...
QString file = QFileDialog::getSaveFileName( this, tr("Save a configuration file..."), QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation), "configuration file (*.ini)"); QString d = file.left(file .lastIndexOf("/")); QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, d); QSettings settings(file, QSettings::IniFormat); settings.beginGroup("Data"); settings.setValue("a1", 0.0); settings.setValue("a2", 0.0); settings.endGroup(); return settings.status();
@Francky033 said in Settings and macOS. Impossible to create a ini file...:
QSettings settings(file, QSettings::IniFormat);
file should be only file name here.
"QString d = file.left(file .lastIndexOf("/"));" - use QFileInfo::absolutePath() to get the folder without file name.
-
jsulm, I modified my code this way, but no effect
QString file = QFileDialog::getSaveFileName( this, tr("Save a configuration file..."), QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation), "configuration file (*.ini)"); QFileInfo f(file); QString d = f.absoluteFilePath(); QString name = f.fileName(); QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, d); QSettings settings(f, QSettings::IniFormat); settings.beginGroup("Data"); settings.setValue("a1", 0.0); settings.setValue("a2", 0.0); settings.endGroup(); return settings.status();
-
But why are you using setPath at all ?
-
I removed the setPath and I still have the same result. When I start the program from qtcreator, everything works. But it does not work anymore when the program is installed on the OS.
This seems to me to be a permissions problem. But how to solve this? -
Did you used macdeployqt before running it outside of Qt ?
-
I removed the setPath and I still have the same result. When I start the program from qtcreator, everything works. But it does not work anymore when the program is installed on the OS.
This seems to me to be a permissions problem. But how to solve this?@Francky033 If it is permission problem OS should ask user upon the startup if read/write permission to folder should be granted (like it happens every time I deploy my software).
It's ok if you run it from QtCreator as child process of QtCreator is allowed standard access to the home tree. -
SGaist : Yes !
artwaw : But if it is not a problem of permissions, where can the problem come from? What also surprises me is the message "No such file or directory" that appears in the log when the settings variable is created and the NoERROR as result of settings::status() at the end of the record.
-
I believe you've been let a stray, this code is taken from my working application:
QString appDataPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) +QString("/"); QString settingsPath = appDataPath + QString("data/Settings.ini"); //And used this way auto settings = new QSettings(settingsPath(), QSettings::IniFormat);
this results in a directory path
qDebug() << Q_FUNC_INFO << settings->fileName();
"/Users/jonashilk/Library/Application Support/CompanyName/Applicationname/data/Settings.ini"
-
SGaist : Yes !
artwaw : But if it is not a problem of permissions, where can the problem come from? What also surprises me is the message "No such file or directory" that appears in the log when the settings variable is created and the NoERROR as result of settings::status() at the end of the record.
@Francky033 I don't have idea what's happening in your system. I'd try to debug the problem by hardcoding known path to the file though, like
/Users/[username]/settings.ini
or something. -
Hello everyone and thanks for your help!
I finally discovered the problem: I had to put a settings.sync() before the settings.status();
While the sync function doesn't seem to have any effect under Windows, Android and linux, it seems necessary to use it under macOS.
The documentation is a bit vague on this: "This function is called automatically from QSettings's destructor and by the event loop at regular intervals, so you normally don't need to call it yourself."
My problem is solved and I hope this can give a clue to people in the same situation as me. Thanks to the Qt forum and its members!
-
Hello,
I am again confronted with the same problem. Everything was working fine and the next day, no directory was accessible for saving using this piece of code!
When the save box opens, I noticed that all the elements in the directory (including .ini files) are grayed out...
What I don't understand is the extremely capricious result of this function (which is so simple). One day it works, the next day it doesn't...Is it a bug in Qt?
Have a nice day!
Francky033
-
Did you restart a build from scratch ?
Re-run macdeployqt on your app bundle ?Apple has introduced several security feature with regard to accessing the user environnement which might trigger here.