在索诺玛,MacOS 菜单栏会根据壁纸、辅助功能设置以及其他事件自动更改其外观。
MacOS Sonoma 菜单栏可以是黑色、白色或半透明,并显示壁纸颜色。然后操作系统似乎会选择菜单栏图标是黑色还是白色,应用程序可以控制它是否变灰。
QSystemTrayIcon 在 Pyside6(Python 封装的 Qt)中开发,允许实现菜单栏图标、菜单、操作等,就像传统上在 Qt 中所做的那样,使用 QAction 来实现菜单项和回调。
import PySide6.QtWidgets as qtw
import PySide6.QtCore as qtc
import PySide6.QtGui as qtg
# Create the tray
self.tray = qtw.QSystemTrayIcon()
self.tray.setIcon(self.icon)
self.tray.setVisible(True)
# Create the menu
self.menu = qtw.QMenu()
self.action = qtg.QAction("About My App...")
self.menu.addAction(self.action)
# Add a Quit option to the menu.
self.quit = qtg.QAction("Quit")
self.quit.triggered.connect(self.app.quit)
self.menu.addAction(self.quit)
# Add the menu to the tray
self.tray.setContextMenu(self.menu)
当操作系统决定(壁纸更改等)或应用程序决定时,菜单栏图标颜色可以改变。我上面的简单实现不符合图标颜色变化,如下所示。
如何正确处理 PySide6 应用程序中的菜单栏图标颜色首选项和更改事件?
PySide6.7 QSystemTrayIcon 文档声明可以在 MacOS 上使用,但似乎没有 QObject 方法来处理操作系统的图标颜色配置和颜色更改事件。
(上面显示的图标是 Google Material Design 图标,已获得 Apache 许可。)
musicamante 所指出的,这已经在here得到了类似的回答。
为了允许操作系统将图标设置为黑色或白色,图标需要通过调用 setIsMask() 设置其 mask 属性:
# Create the icon
self.icon = qtg.QIcon("img/widgets_96.png")
self.icon.setIsMask(True)
要在应用程序未启用时将图标设置为灰色(如上面的焦点和舞台管理器图标),我想我可以简单地设置一个灰色图标,而不设置遮罩。感谢评论中的
musicamante,以及Giacomo 8年前提供的解决方案。