0

在我的 Qt 应用程序中,我想为用户提供将应用程序的明暗主题设置为:

  1. 与操作系统主题相同
  2. Light(忽略操作系统主题)
  3. 深色(忽略操作系统主题)

对于 1. 我可以使用这个 Objective C 来计算操作系统主题:

bool macIsInDarkTheme()
{
    if (__builtin_available(macOS 10.14, *))
    {
        auto appearance = [NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:
                @[ NSAppearanceNameAqua, NSAppearanceNameDarkAqua ]];
        return [appearance isEqualToString:NSAppearanceNameDarkAqua];
    }
    return false;
}

对于 2. 我可以称之为目标 C:

void macSetToLightTheme()
{
    if (__builtin_available(macOS 10.14, *))
    {
        [NSApp setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameAqua]];
    }
}

对于 3. 我可以称之为目标 C:

void macSetToDarkTheme()
{
   if (__builtin_available(macOS 10.14, *))
   {
        [NSApp setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]];
   }
}

这一切都有效。如果用户想要从 2. 或 3. 回到 1,就会出现问题。如何将外观设置回从操作系统获取的默认值?我是一名 C++ 程序员,在 Objective C 方面并没有任何经验。

4

1 回答 1

1

将应用程序的外观设置为 nil 应该回退到默认行为(从系统偏好继承的外观):

[NSApp setAppearance:nil];

https://developer.apple.com/documentation/appkit/nsapplication/2967170-appearance?language=objc

当此属性的值为 nil(默认值)时,AppKit 将当前系统外观应用到应用程序的用户界面元素,包括其窗口、视图、面板和弹出框。将 NSAppearance 对象分配给此属性会导致应用程序的界面元素采用指定的外观。

于 2021-03-19T17:45:59.387 回答