在QT系统托盘应用中更新菜单

4 投票
1 回答
1861 浏览
提问于 2025-04-18 14:00

我需要更新一个系统托盘应用程序的菜单项。最开始,当应用程序加载时,会有两个菜单项。后来,当我点击一个按钮时,这些菜单项需要被新的菜单项替换掉。我该怎么做呢?这是我的代码。

from PySide.QtGui import *
import sys

class MainWindow(QMainWindow):
  def __init__(self):
    super(MainWindow, self).__init__()

    self.tray = QSystemTrayIcon(QApplication.style().standardIcon(QStyle.SP_DriveDVDIcon), self)
    self.m = QMenu()
    self.m.addAction('First')
    self.m.addAction('Second')
    self.tray.setContextMenu(self.m)
    self.tray.show()

    p = QPushButton("Click Me", self)
    self.setCentralWidget(p)
    p.clicked.connect(self.onClick)

  def onClick(self):
    self.m.clear()
    self.m.addAction('First')
    self.m.addAction('Third')
    self.tray.setContextMenu(self.m)

app = QApplication(sys.argv)
w = MainWindow()
w.show();
sys.exit(app.exec_())

不过,这个方法并没有奏效。如果我尝试去掉 self.m.clear(),新的菜单项就会添加到现有的菜单项后面(这在这种情况下是正常的行为)。难道 menu.clear() 不是应该清空当前菜单,然后在这里填充新的菜单吗?

我看到过一个类似的问题 Qt QSystemTrayIcon 更改菜单项,但那个解决方案对我没有用。我正在使用 Ubuntu 14.04。

1 个回答

2

我搞明白了,问题出在 self.tray.setContextMenu(self.m) 这一行。把这行代码从 onClick 方法中删掉就可以了。这样在Ubuntu上应该就没问题了。

撰写回答