无法更改 QSettings 的路径
Unable to change path of QSettings
我用c:\windows\winf32.ini
来存储软件参数,我可以这样读取:
QSettings settings("c:/windows/winf32.ini", QSettings::IniFormat, Q_NULLPTR);
我可以用绝对路径读取文件,但是当我使用setValue()
和sync()
时,文件没有更新。
但是,使用相对路径 "winf32.ini"
他正确地写入了更改,但它不在 c:\windows\
路径中。
默认情况下,对于 QSettings::IniFormat
,使用以下文件:
- FOLDERID_RoamingAppData\MySoft\Star Runner.ini
- FOLDERID_RoamingAppData\MySoft.ini
- FOLDERID_ProgramData\MySoft\Star Runner.ini
- FOLDERID_ProgramData\MySoft.ini
所以要改变它,我试过这个:
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, "c:/windows");
QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, "c:/windows");
QSettings settings("winf32.ini", QSettings::IniFormat, Q_NULLPTR);
但是settings
是空的。
我在声明我的 settings
变量之前使用 setPath
,因为在 QSettings doc 中它说:
Warning: This function doesn't affect existing QSettings objects.
我不明白是什么问题。
这绝对是权限问题。您的用户可能拥有管理权限,但由于 UAC (User Account Control),您必须明确将这些权限授予任何新进程,否则该进程将以较低的授权级别执行。例如,这就是为什么 Windows 每次都询问您是否要 运行 某些软件(例如安装程序)作为管理员的原因,即使您的用户 是 管理员。
要检查它,只需打开文件资源管理器,转到编译可执行文件的目录,右键单击可执行文件并选择 "Run as administrator"。 Windows(实际上是 UAC)会要求您确认操作。之后,检查你的INI文件是否已经修改。
您可以通过设置链接器标志强制您的可执行文件每次 运行 请求管理权限:
Visual Studio: 转到项目的属性,然后 Linker > Manifest File > UAC 执行级别 并将其设置为requireAdministrator
。 (不要忘记为项目的所有配置设置它)。
Qt Creator (qmake): 添加QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"
到你的.pro文件。
为了回答的完整性,我使用以下代码进行了测试:
#include <QSettings>
int main(int argc, char* argv[])
{
QSettings settings("c:/windows/winf32.ini", QSettings::IniFormat);
settings.setValue("hello", "world");
return 0;
}
我用c:\windows\winf32.ini
来存储软件参数,我可以这样读取:
QSettings settings("c:/windows/winf32.ini", QSettings::IniFormat, Q_NULLPTR);
我可以用绝对路径读取文件,但是当我使用setValue()
和sync()
时,文件没有更新。
但是,使用相对路径 "winf32.ini"
他正确地写入了更改,但它不在 c:\windows\
路径中。
默认情况下,对于 QSettings::IniFormat
,使用以下文件:
- FOLDERID_RoamingAppData\MySoft\Star Runner.ini
- FOLDERID_RoamingAppData\MySoft.ini
- FOLDERID_ProgramData\MySoft\Star Runner.ini
- FOLDERID_ProgramData\MySoft.ini
所以要改变它,我试过这个:
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, "c:/windows");
QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, "c:/windows");
QSettings settings("winf32.ini", QSettings::IniFormat, Q_NULLPTR);
但是settings
是空的。
我在声明我的 settings
变量之前使用 setPath
,因为在 QSettings doc 中它说:
Warning: This function doesn't affect existing QSettings objects.
我不明白是什么问题。
这绝对是权限问题。您的用户可能拥有管理权限,但由于 UAC (User Account Control),您必须明确将这些权限授予任何新进程,否则该进程将以较低的授权级别执行。例如,这就是为什么 Windows 每次都询问您是否要 运行 某些软件(例如安装程序)作为管理员的原因,即使您的用户 是 管理员。
要检查它,只需打开文件资源管理器,转到编译可执行文件的目录,右键单击可执行文件并选择 "Run as administrator"。 Windows(实际上是 UAC)会要求您确认操作。之后,检查你的INI文件是否已经修改。
您可以通过设置链接器标志强制您的可执行文件每次 运行 请求管理权限:
Visual Studio: 转到项目的属性,然后 Linker > Manifest File > UAC 执行级别 并将其设置为
requireAdministrator
。 (不要忘记为项目的所有配置设置它)。Qt Creator (qmake): 添加
QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"
到你的.pro文件。
为了回答的完整性,我使用以下代码进行了测试:
#include <QSettings>
int main(int argc, char* argv[])
{
QSettings settings("c:/windows/winf32.ini", QSettings::IniFormat);
settings.setValue("hello", "world");
return 0;
}