Проверьте, существует ли реестр значений с помощью QSettings

То, что я пытаюсь сделать, это проверить, существует ли в реестре ключ реестра (НЕ ЗНАЧЕНИЕ, КЛЮЧ). Я не могу найти способ проверить это.

Идея?

2 ответа

Решение

РЕДАКТИРОВАТЬ:

В 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,

В зависимости от характера настроек и платформы, они будут храниться в реестре или в файле / etc.

Но в ответе @mateuszb говорится, что QSettings может открывать ключи Windows, если вы используете QSettings::NativeFormat:

http://doc.qt.io/qt-5/qsettings.html

Я по-прежнему предполагаю, что если вы жестко кодируете что-то вроде "HKEY_LOCAL_MACHINE" в своем источнике, то вы на самом деле не в духе абстрагирования своего кода между платформами так, как намеревается Qt. Но вы, очевидно, можете (по крайней мере, в последних версиях Qt) делать это, не копаясь под Qt и не вызывая API реестра Windows.

Используя 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;

Я все еще не могу найти способ проверки групп. Однако вы можете установить ключ внутри группы и проверить наличие этого ключа:

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

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

Для этого требуется дополнительный ключ внутри группы под названием "name", который соответствует имени вашей группы.

Другие вопросы по тегам