【问题标题】:Simulate user clicking in QSystemTrayIcon模拟用户点击 QSystemTrayIcon
【发布时间】:2014-04-23 23:31:20
【问题描述】:

即使通过activated 插槽正在执行,菜单仍然没有显示。我通过手动单击托盘图标和模拟单击进行了跟踪,并且它经历了相同的执行逻辑。

目前我有

class MyClass(QObject):
   def __init__():
       self._testSignal.connect(self._test_show)
       self.myTrayIcon.activated.connect(lambda reason: self._update_menu_and_show(reason))

   def show():
       self._testSignal.emit()

   @pyqtSlot()
   def _test_show():
       self._trayIcon.activated.emit(QtWidgets.QSystemTrayIcon.Trigger)

   @QtCore.pyqtSlot()
   def _update_menu_and_show(reason):
       if reason in (QtWidgets.QSystemTrayIcon.Trigger):
        mySystemTrayIcon._update_menu()

...
class MySystemTrayIcon(QSystemTrayIcon):

   def _update_menu(self):
      # logic to populate menu
      self.setContextMenu(menu)
...
MyClass().show()

【问题讨论】:

  • 我刚刚对 PyQt v4 做了一个快速测试,它似乎工作正常(示例在这里:pastebin.com/NkAQQyqt)。如果你看不出我所做的有什么不同,和/或将我的代码移植到 PyQt5 仍然会导致你的问题,这可能是 PyQt5 中的一个错误。
  • @three_pineapples 你的脚本帮助我意识到我的设置问题。现在有菜单不显示的问题。请查看修改。
  • @mingxiao 请删除不再相关的问题的早期部分,因为从技术上讲,您现在正在查看不同的问题。请记住,SO 不是一个讨论线程,它是一个问答论坛。问题必须独特且定义明确,以便它与答案相互关联。

标签: python qt pyqt trayicon


【解决方案1】:

这是我如何弹出与托盘图标关联的上下文菜单

class MyClass(QObject):
   def __init__():
       self._testSignal.connect(self._test_show)
       self.myTrayIcon.activated.connect(lambda reason: self._update_menu_and_show(reason))

   def show():
       self._testSignal.emit()

   @pyqtSlot()
   def _test_show():
       self._trayIcon.activated.emit(QSystemTrayIcon.Context)

   @QtCore.pyqtSlot()
   def _update_menu_and_show(reason):
       if reason in (QSystemTrayIcon.Trigger, QSystemTrayIcon.Context):
           mySystemTrayIcon._update_menu()
           # Trigger means user initiated, Context used for simulated
           # if simulated seems like we have to tell the window to explicitly show

           if reason == QSystemTrayIcon.Context:
               mySystemTrayIcon.contextMenu().setWindowFlags(QtCore.Qt.WindowStaysOnTopHint|QtCore.Qt.FramelessWindowHint)
               pos = mySystemTrayIcon.geometry().bottomLeft()
               mySystemTrayIcon.contextMenu().move(pos)
               mySystemTrayIcon.contextMenu().show()

...
class MySystemTrayIcon(QSystemTrayIcon):

   def _update_menu(self):
      # logic to populate menu
      self.setContextMenu(menu)
...
MyClass().show()

看来您必须在上下文菜单中设置WindowStaysOnTopHint 才能显示它。 此解决方案特定于 mac,因为它假定任务栏位于顶部。

一个副作用是上下文菜单始终位于顶部,即使用户单击其他位置也是如此。我在上下文菜单上放置了一个事件过滤器,它注册的唯一有用的事件是QEvent.Leave

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2021-05-24
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多