模拟用户在 QSystemTrayIcon 中单击

2023-12-08

即使通过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()

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟用户在 QSystemTrayIcon 中单击 的相关文章

随机推荐

  • MVVM 将 RelayCommand CanExecute 绑定到属性?

    我有一个计时器和三个按钮来控制它 开始 停止和暂停 每个按钮都绑定到一个 RelayCommand 我有一个 TimerState 类型的属性enum TimerState 这对于设置各种 GUI 元素很有用 有没有办法以某种方式将 Rel
  • 根据空格或“双引号字符串”将字符串解析为数组

    我试图获取用户输入字符串并解析为一个名为 char entire line 100 的数组 其中每个单词都放在数组的不同索引处 但如果字符串的一部分用引号封装 则应将其放在单个索引中 所以如果我有 char buffer 1024 0 fg
  • 无法获取托管类型的地址、获取其大小或声明指向托管类型(“类型名称”)的指针

    如果我的结构中有一个或多个 System String 此错误将停止编译还有其他方式存储字符串吗 我尝试过这样的事情 private long B ID private byte C Name private byte C Address
  • 互斥体未释放

    我的 c WinForm 解决方案包含多个项目 其中包括包含 frmAdmin 的管理项目和包含 frmUser 的用户项目 第三个项目包含 frmTimer 它有一个定期启动 frmUser 的计时器 我希望 frmTimer 在 frm
  • 仅使用生产证书时无法注册推送通知

    使用开发证书时 推送通知工作正常 当我在临时发行版中切换到生产证书时 应用程序无法注册推送通知 在 UIApplicationDelegate 中 两者都没有didRegisterForRemoteNotificationsWithDevi
  • Java Swing,尝试用图像图标复选框替换 JTable 中的布尔复选框

    所以我有一个带有复选框的 JTable 我希望复选框在 选中 时包含一个图像 在 未选中 时包含另一图像 即显示图像而不是选中或未选中的框 有没有办法做到这一点 我尝试过使用 TableCellRenderer 返回带有 ImageIcon
  • 自反传递闭包的定义

    许多谓词本质上使用某种形式的传递闭包 只是发现终止也必须得到解决 为什么不一劳永逸地解决这个问题closure0 3 meta predicate closure0 2 meta predicate closure 2 meta predi
  • 第 n 个范围的 CSS 选择器?

    如何调整下面的 CSS 选择器 myTableRow td nth child background color FFFFCC 所以它适用于td列2 4 table tr class myTableRow td column 1 td td
  • 有没有办法将 Linux 共享库加载到特定的内存位置?

    我有一个 Linux 应用程序 它在运行时加载非常小的 一些小函数 共享库 由于各种重要原因 我需要将共享库加载到特定的虚拟内存范围 然而 dlopen 没有提供任何方法 我可以看到 来告诉它或提示它 将其加载的内容放在哪里 有没有办法告诉
  • 导入错误:没有名为“app”的模块

    我正在开发一个具有以下树结构的项目 Project app main py svg to png py init py tests init py unittests basic test py init py 我正在使用以下命令将应用程序
  • Google App Engine - 数据存储实体的 ID 是否会为负数?

    数据存储实体的 ID 是否会为负数 或者它们保证是正数吗 我找不到明确说明这一点的文档 但我从未见过负面的文档 这docs确实 随着新实体的创建 这一数字通常会增加 但不应严格依赖它们 因为您可能会得到稍微乱序的 id 例如 10 11 1
  • 用 mod 重写删除尾部斜杠?

    这与我之前的问题有关 可以查看here 我希望能够删除 URL 中的尾部斜杠 这样它就不会弄乱我网站的某些区域 htaccess 代码在这里 s File Exists RewriteCond REQUEST FILENAME s OR l
  • Rails 3 中不带尾部斜杠的重定向到规范路线

    在 Rails 3 上 我尝试从没有尾部斜杠的 URL 重定向到有斜杠的规范 URL match test to gt redirect test 但是 上面的路由同时匹配 test 和 test 导致重定向循环 如何使其仅匹配不带斜杠的版
  • 如何在C++中生成随机数?

    我正在尝试用骰子制作游戏 并且需要其中包含随机数 以模拟骰子的侧面 我知道如何使其在 1 到 6 之间 使用 include
  • isolatedStorage:删除卸载程序中的首选项?

    我们的应用程序将用户首选项保存在独立存储中 然而 事实证明 从我们的卸载程序中删除这些文件是很棘手的 我可以枚举隔离存储中的所有文件 使用 MSDN 示例代码 找到与我们的强名称密钥相关的文件 并尝试删除 删除它们 不幸的是 这就是一切崩溃
  • 如何运行后台线程定期清理列表中的某些元素?

    我目前正在实施缓存 我已经完成了基本的实现 如下所示 我想要做的是运行一个线程来删除满足某些条件的条目 class Cache int timeLimit 10 how long each entry needs to be kept af
  • 为什么在 clojure 中 will (seq #{3 1 22 44}) 会输出 (1 3 44 22) ?

    它是如何工作的 序列 3 1 22 44 为什么顺序会像 1 3 44 22 因为根据定义 集合数据结构是无序的 http en wikipedia org wiki Set data struct 更准确地说 Clojure 的内置集 b
  • 如何在事件侦听器中将元素作为参数传递

    我有一个程序 其中有大量可重用元素 所有这些元素都需要事件侦听器 因此 我需要一种从侦听器获取元素的方法 这是我想在代码中执行的操作 document querySelectorAll class forEach function el e
  • Telegram 机器人等待用户回复

    下面的代码是针对电报机器人这基本上需要一个人username and password并验证它以提供他的平均支出 我们看到的问题是机器人等待用户发送他的用户名和密码10 sec要么浪费时间 要么 没有给予足够的时间 我怎样才能编程 让机器人
  • 模拟用户在 QSystemTrayIcon 中单击

    即使通过activated插槽正在执行 菜单仍未显示 我通过手动单击托盘图标和模拟单击进行了跟踪 并且其执行逻辑相同 目前我有 class MyClass QObject def init self testSignal connect s