检查QSettings中是否存在某个值的注册表

10

我想做的是检查注册表中是否存在一个键(而不是值,键)。 我找不到任何检查的方法。

有什么想法吗?

3个回答

21
使用QSettings,您可以打开键的父项并检索其键列表。使用函数childGroups()获取键的列表。在Qt中,“组”似乎是Windows注册表中的键。
这是我找到的唯一检查键是否存在的方法。在此代码中,我查找键“SearchedKey”。
QSettings settings(
    "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths",
    QSettings::NativeFormat
);

if (settings.childGroups().contains("SearchedKey", Qt::CaseInsensitive))
    std::cout << "Key exists" << std::endl;
else
    std::cout << "Key doesn't exist" << std::endl;

1
注意:如果您没有使用特殊键“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths”,而是使用类似于QSettings settings("HKEY_LOCAL_MACHINE\\Software\\MySoft\\Star Runner\\CurrentVersion\\App Paths", QSettings::NativeFormat);这样的默认设置,那么调用settings.childGroups()将会创建一个空的注册表键HKEY_LOCAL_MACHINE\SOFTWARE\MySoft\Star Runner\CurrentVersion\App Paths。这可能是一个不希望发生的副作用。我相信没有办法阻止这种情况的发生。 - Sacha Guyer

0

编辑:

2011年我写道:

注册表是Windows的概念,不适用于Qt的跨平台概念。您将需要使用Windows API或其C++包装器。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724875(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/xka57xy4(v=vs.80).aspx

如果您的应用程序需要更抽象的保存和恢复自己的设置,Qt有一个称为QSettings的跨平台设计。

根据设置的性质和平台,将这些存储在注册表中或文件/等中。

但是,在@mateuszb的答案中似乎表明,如果您使用QSettings::NativeFormat,则QSettings可以打开Windows键:

http://doc.qt.io/qt-5/qsettings.html#Format-enum

我仍然建议,如果您像“HKEY_LOCAL_MACHINE”这样将某些内容硬编码到源代码中,那么您实际上并没有按照Qt的意图在各个平台上抽象化您的代码。但是显然您可以(至少在最近的Qt版本中)在不深入Qt并调用Windows注册表API的情况下完成此操作。

0

目前我还没有找到检查组的方法。但是你可以在组内设置一个键,并检查该键是否存在:

QString groupname = "group";
QString keyname = "/name";
QString name_read = settings.value(groupname + keyname, QString()).toString();

if(name_read == groupname){
    ...
}else {
    // default action
}

这需要在名为“name”的组内添加一个额外的键,该键设置为您的组的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接