无法更改 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,使用以下文件:

  1. FOLDERID_RoamingAppData\MySoft\Star Runner.ini
  2. FOLDERID_RoamingAppData\MySoft.ini
  3. FOLDERID_ProgramData\MySoft\Star Runner.ini
  4. 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;
}