我们根据前面的介绍在项目目录中创建两个不同主题样式的文件如下所示。然后根据样式的需要定义对应的相关内容如下是浅色的主题定义通过定义对应控件的颜色、字体、背景色等相关属性实现统一的效果。通过辅助类我们创建几个菜单来实现不同样式的切换。theme_menu menu_bar.addMenu(界面主题) light_action ControlUtil.create_menu( self, theme_menu, 浅色主题, info ) light_action.triggered.connect(lambda: self.set_theme(1)) dark_action ControlUtil.create_menu( self, theme_menu, 深色主题, info ) dark_action.triggered.connect(lambda: self.set_theme(2)) system_action ControlUtil.create_menu( self, theme_menu, 初始主题, info ) system_action.triggered.connect(lambda: self.set_theme(0))菜单界面效果如下所示。其中样式的信号处理我们通过一个单件的样式总线对象来处理。def set_theme(self, theme_type): 设置主题颜色 self.theme_type theme_type # 切换主题颜色 ThemeBus().set_theme_type(self.theme_type)其中我们对样式总线对象的变化进行信号绑定处理。#监听主题变化的事件 ThemeBus().theme_type_changed.connect(self.on_theme_changed)对主题样式的变化进行处理。def on_theme_changed(self, theme_type): 主题变化的事件处理 theme_map { 1: light, 2: dark, 0: #不设置主题默认使用系统主题 } theme_name theme_map[self.theme_type] self.log.info(f主题变化: {theme_type}{theme_name}) # 切换主题颜色 ThemedHelper.apply(theme_type)这个主题的辅助类主要就是根据当前总线的样式值加载对应的样式文件进行设置如果为空这还原为最初的默认样式。class ThemedHelper: 控件主题辅助类 staticmethod def apply(theme_type: int 0): 应用主题样式 theme_name if theme_type 1: theme_name light elif theme_type 2: theme_name dark else: theme_name if not theme_name: qss # 自动主题 无需加载 qss 文件 else: with open(fapp/themes/{theme_name}.qss, encodingutf8) as f: qss f.read() app : QApplication QApplication.instance() if app: app.setStyle(Fusion) app.setStyleSheet(qss)暗色主题的效果如下所示。如果不喜欢厚重的主题我们也可以切换会原来的默认主题。