#objective-c #macos #qt #darkmode
Вопрос:
В моем приложении Qt я хочу предоставить пользователю возможность установить светлую/темную тему своего приложения на:
- То же, что и тема операционной системы
- Свет (игнорируя тему операционной системы)
- Темный (игнорируя тему операционной системы)
Для 1. Я могу просто разработать тему операционной системы, используя эту цель 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.
Ответ №1:
Установка внешнего вида приложения на ноль должна соответствовать поведению по умолчанию (внешний вид унаследован от системных настроек).:
[NSApp setAppearance:nil];
https://developer.apple.com/documentation/appkit/nsapplication/2967170-appearance?язык=objc
Если значение этого свойства равно нулю (по умолчанию), AppKit применяет текущий внешний вид системы к элементам пользовательского интерфейса приложения, включая его окна, представления, панели и всплывающие окна. Присвоение этому свойству объекта NSAppearance приводит к тому, что элементы интерфейса приложения вместо этого принимают указанный внешний вид.
Комментарии:
1. Спасибо, я это проверю.