首先,我是一位经验丰富的 C 程序员,但对 Python 还是个新手。我想使用 pyqt 在 python 中创建一个简单的应用程序。让我们想象一下这个应用程序,它很简单,当它运行时,它必须在系统托盘中放置一个图标,并且它在其菜单中提供了一个选项来退出应用程序。
这段代码有效,它显示了菜单(为了简单起见,我没有连接退出操作等)
import sys
from PyQt4 import QtGui
def main():
app = QtGui.QApplication(sys.argv)
trayIcon = QtGui.QSystemTrayIcon(QtGui.QIcon("Bomb.xpm"), app)
menu = QtGui.QMenu()
exitAction = menu.addAction("Exit")
trayIcon.setContextMenu(menu)
trayIcon.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
但这不是:
import sys
from PyQt4 import QtGui
class SystemTrayIcon(QtGui.QSystemTrayIcon):
def __init__(self, icon, parent=None):
QtGui.QSystemTrayIcon.__init__(self, icon, parent)
menu = QtGui.QMenu()
exitAction = menu.addAction("Exit")
self.setContextMenu(menu)
def main():
app = QtGui.QApplication(sys.argv)
trayIcon = SystemTrayIcon(QtGui.QIcon("Bomb.xpm"), app)
trayIcon.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
我可能错过了什么。没有错误,但在第二种情况下,当我单击右键时,它不显示菜单。
原文由 Nextorlg 发布,翻译遵循 CC BY-SA 4.0 许可协议
好吧,经过一些调试我发现了问题。 QMenu 对象在完成
__init__
函数后被销毁,因为它没有父对象。虽然 QSystemTrayIcon 的父对象可以是 QMenu 的对象,但它必须是 Qwidget。此代码有效(请参阅 QMenu 如何获得与作为 QWidget 的 QSystemTrayIcon 相同的父级):