Daniel
2024-12-06 91274c58b1772dfe38d3fcab291693141e822684
Fix WindowsRegistryKey for Qt 6.8.1 (#154)

* Fix WindowsRegistryKey for Qt 6.8.1

* Use new Qt Private API instead of restoring the old version

* Applied review changes

- Moved template specializations to header, had to add inline for this to work
- Added const qualifiers
- Added space after if
- Removed unneeded new lines
- Removed new lines inserted by the IDE
- Removed general template implementation, static asserts did not compile (due to MOC i think). Using the function with any other type than DWORD will still cause a compilation error

* Fix const

* Fix line ending
3个文件已修改
56 ■■■■ 已修改文件
src/core/qwindowkit_windows.cpp 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/qwindowkit_windows.h 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/shared/qwkwindowsextra_p.h 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/core/qwindowkit_windows.cpp
@@ -85,6 +85,10 @@
                               reinterpret_cast<unsigned char *>(&value), &size) == ERROR_SUCCESS;
        return qMakePair(value, ok);
    }
#elif QT_VERSION < QT_VERSION_CHECK(6, 8, 1)
    WindowsRegistryKey::WindowsRegistryKey(HKEY parentHandle, QStringView subKey, REGSAM permissions, REGSAM access)
        : QWinRegistryKey(parentHandle, subKey, permissions, access)
    {
    }
#endif
}
src/core/qwindowkit_windows.h
@@ -125,6 +125,9 @@
        QString stringValue(QStringView subKey) const;
        QPair<DWORD, bool> dwordValue(QStringView subKey) const;
        template<typename T>
        std::optional<T> value(QStringView subKey) const;
    private:
        HKEY m_key;
@@ -134,6 +137,33 @@
    inline bool WindowsRegistryKey::isValid() const {
        return m_key != nullptr;
    }
    template<>
    inline std::optional<DWORD> WindowsRegistryKey::value(QStringView subKey) const {
        const auto dv = dwordValue(subKey);
        if (!dv.second) {
            return {};
        }
        return dv.first;
    }
#elif QT_VERSION < QT_VERSION_CHECK(6, 8, 1)
    class WindowsRegistryKey : public QWinRegistryKey {
    public:
        explicit WindowsRegistryKey(HKEY parentHandle, QStringView subKey, REGSAM permissions = KEY_READ, REGSAM access = 0);
        template<typename T>
        inline std::optional<T> value(QStringView subKey) const;
    };
    template<>
    inline std::optional<DWORD> WindowsRegistryKey::value(QStringView subKey) const {
        const auto dv = dwordValue(subKey);
        if (!dv.second) {
            return {};
        }
        return dv.first;
    }
#else
    using WindowsRegistryKey = QWinRegistryKey;
#endif
src/core/shared/qwkwindowsextra_p.h
@@ -345,11 +345,8 @@
        if (!registry.isValid()) {
            return false;
        }
        auto value = registry.dwordValue(L"ColorPrevalence");
        if (!value.second) {
            return false;
        }
        return value.first;
        auto value = registry.value<DWORD>(L"ColorPrevalence");
        return value.value_or(false);
    }
    static inline bool isHighContrastModeEnabled() {
@@ -368,11 +365,8 @@
        if (!registry.isValid()) {
            return false;
        }
        auto value = registry.dwordValue(L"AppsUseLightTheme");
        if (!value.second) {
            return false;
        }
        return !value.first;
        auto value = registry.value<DWORD>(L"AppsUseLightTheme");
        return value.value_or(false);
#endif
    }
@@ -398,13 +392,13 @@
        if (!registry.isValid()) {
            return {};
        }
        auto value = registry.dwordValue(L"AccentColor");
        if (!value.second) {
        auto value = registry.value<DWORD>(L"AccentColor");
        if (!value) {
            return {};
        }
        // The retrieved value is in the #AABBGGRR format, we need to
        // convert it to the #AARRGGBB format which Qt expects.
        QColor color = QColor::fromRgba(value.first);
        QColor color = QColor::fromRgba(*value);
        if (!color.isValid()) {
            return {};
        }