如果程序要跟随系统主题色进行切换,需监听当前系统的主题色,下面介绍Windows和MacOS下获取当前系统主题的方法
Windows
系统切换主题
以win10为例,点击右键选择个性化,进入个性化页面,选择左侧颜色的Tab,
选择右边的选择颜色下拉框,可以看到有三个选项,浅色和深色就很好理解,选择自定义可以看到会多两个选项,一个是系统的主题色,一个是应用的主题色。选择浅色时,系统主题色和应用主题色都是浅色,选择深色时系统主题色和应用主题色都是深色,自定义用于系统主题色和应用主题色分开设置。系统主题色指的是系统窗口的主题色,比如任务栏,任务栏右键菜单,开始菜单等等,我们以应用的主题色为基准进行变化。
读注册表获取系统主题
Windows系统配置都是存储在注册表,经过查资料,找到主题设置相关的注册表位置,计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize,选择Personalize,右侧显示主题相关的设置项,其中SystemUsesLightTheme对应自定义设置项中的默认Windows模式,AppsUseLightTheme对应自定义设置中的默认应用模式。
代码实现
使用Qt获取该注册表的信息即可知道当前系统设置的主题色
QSettings settings(QSettings::UserScope, "Microsoft", "Windows\\CurrentVersion\\Themes\\Personalize");
bool isDark = !settings.value("AppsUseLightTheme").toBool();//0:深色 - 1:浅色
我们要实现自动跟随系统切换,只需放到线程中一直检测即可
MacOS
系统主题设置
Mac系统的主题设置就比较简单明了,Mac的系统多了一项自动,会根据环境切换主题,比如天黑了会自动切换成深色主题
Mac是有命令直接获取当前是否为深色模式,
defaults read -g AppleInterfaceStyle,如果是深色模式,则返回Dark,如果不是深色,则会返回找不到
代码实现
代码实现不是通过执行命令行获取,Mac有专门的方法,需要注意的是该代码是objective-c,需放到.mm文件中,之前有文章介绍过.mm相关的内容。
NSString *interfaceStyle = [NSUserDefaults.standardUserDefaults valueForKey:@"AppleInterfaceStyle"];
BOOL dark = [interfaceStyle isEqualToString:@"Dark"];
自动跟随系统变化和Win的逻辑是一样,放到线程中检测。