pyqt5 qsystemtrayicon激活信号不起作用



我在PYQT5程序中单击系统托盘图标时尝试打印文本。我试图将PYQT5 QSYSTEMTRAYICON激活信号(单击系统托盘图标时发射(与自定义方法联系起来,但该方法未调用。这是简单的示例:

import sys
from PyQt5.QtWidgets import QSystemTrayIcon, QApplication
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

@pyqtSlot()
def action(signal):
    print('test1')
app = QApplication(sys.argv)
icon = QSystemTrayIcon(QIcon('any_icon.png'), app)
icon.show()
icon.activated.connect(action)
#icon.activated['QSystemTrayIcon::ActivationReason'].connect(action)
#icon.pyqtConfigure(activated=action)
print(icon.receivers(icon.activated))  # to check if is connected
sys.exit(app.exec_())

例如,将信号连接到插槽的3种方法(其中两个评论(。我尝试使用和不使用Decorator @pyqtslot((使用方法。连接不会引起任何错误。即使是信号接收器的打印,也说它连接到1个插槽。但是,当单击Systray图标时,它无能为力。

问题:信号连接不正确,还是根本没有发出信号?

系统:ubuntu 16.04,pyqt5.8。但是,由于PYQT是乘法形式,也应该在其他系统上工作。PS:我已经阅读了官方的PYQT5信号/插槽文档,以及有关堆栈溢出的许多相关问题,但没有发现相同的问题。我认为最接近的是C ,但不适用于Python。任何提示都将不胜感激。非常感谢!编辑:修复了文本中的错别字

您的示例在带有stalonetray的OpenBox下的Xubuntu中正常工作。但是,在Xubuntu中,它无效!但是当我添加类似:

之类的东西时
mNu =  QMenu() 
test =  QAction('Test',mNu)
test.triggered.connect(action)
icon.setContextMenu(mNu)

它在Xubuntu工作。我看来Ubuntu只希望在托盘上显示菜单。

基于@murdo和@eyllanesc答案,我在多个系统上测试了示例代码。仅使用Python 3.5和pip3 install pyqt5进行清洁安装。系统托盘图标激活信号为:

不工作:

  • ubuntu 16.04- unity,pyqt 5.8和pyqt 5.5.1
  • ubuntu 16.10- unity,pyqt 5.8和pyqt 5.7

工作:

  • ubuntu 16.04 -Gnome,pyqt 5.8
  • Arch Linux -GNOME,PYQT 5.8
  • kubuntu 16.10,kde,pyqt 5.7
  • Xubuntu-带Stalonetray的OpenBox

看来示例代码是正确的,并且使用 qt 中的 bug使用 unity - QSystemTrayIcon - CC_2在单击系统托盘图标。错误报告链接。

解决方案 QSystemTrayIcon激活(单击(信号可以通过将QMenu分配给系统托盘图标并检测QMenu().aboutToShow信号来绕过信号。这样,当单击托盘图标时,发送信号aboutToShow,然后显示菜单。这不是完全相同的结果,但是似乎没有其他方法可以在 unity 上检测系统托盘图标激活。感谢@murdo的想法。简单的代码示例:

import sys
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu
from PyQt5.QtGui import QIcon

def action():
    print('System tray icon clicked.')
app = QApplication(sys.argv)
icon = QSystemTrayIcon(QIcon('any_icon.png'), parent=app)
icon.show()
menu = QMenu(parent=None)
menu.aboutToShow.connect(action)
icon.setContextMenu(menu)
sys.exit(app.exec_())

最新更新