>Background
我正在 PyQt5 中开发一个使用系统托盘的应用程序。我已经在 LXDE 上尝试过该应用程序,其中左键单击系统托盘图标会显示菜单(右键单击由 LXDE 处理)。我运行XFCE的朋友现在也尝试了该应用程序,但对他来说,左键单击系统托盘图标时没有任何反应,要查看菜单,他必须右键单击
问题
如何在 XFCE 图标中左键单击系统托盘以显示系统托盘菜单?
设置
Qt版本:5.7.1
法典
tray_icon = QtWidgets.QSystemTrayIcon(
QtGui.QIcon(mc_global.get_app_icon_path()),
self.matc_qapplication
)
tray_icon.show()
tray_menu = QtWidgets.QMenu(main_window)
# adding menu entries
tray_icon.setContextMenu(tray_menu)
XFCE基于GTK2,其托盘无法处理鼠标左键单击。解决方法是安装一个包sni-qt
,该包添加额外的菜单项"激活"以右键单击鼠标。安装此软件包后,您必须创建一个配置文件$HOME/.config/sni-qt.conf
包含以下内容:
[need-activate-action]
myapp=1
其中myapp
是应用程序名称。
可以像这样使用activated
信号:
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
# ...
self.tray_icon = QtWidgets.QSystemTrayIcon(QtGui.QIcon("icon.png"), self)
self.tray_icon.activated.connect(self.on_systray_activated)
# ...
def on_systray_activated(self, i_activation_reason):
# ...
这适用于 XFCE 4.12
文档:
- http://doc.qt.io/qt-5/qsystemtrayicon.html#activated
- http://doc.qt.io/qt-5/qsystemtrayicon.html#ActivationReason-enum