我在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_())