【发布时间】:2026-01-26 09:05:02
【问题描述】:
我正在尝试实现一个“打开”按钮,这样如果用户按住它,就会弹出一个供用户选择的应用程序菜单;但是一旦用户释放鼠标,菜单就会消失。如果用户在未选择菜单上的应用程序的情况下释放鼠标,则应使用默认应用程序打开文件。我将此按钮实现为QToolButton,并按如下方式连接信号:
self.ui_open_btn.pressed.connect(self._onOpenBtnPressed)
self.ui_open_btn.triggered.connect(self._onOpenBtnTriggered)
def _onOpenBtnPressed(self):
self.ui_open_btn.showMenu()
def _onOpenBtnTriggered(self, action):
application_name = action.text()
# code to launch the application
现在,当用户按下按钮时,菜单会弹出。但是,当用户释放按钮时,菜单仍然存在,并且通过单击它来触发菜单上的操作。我在DelayedPopup 和InstantPopup 模式下都试过了。只要菜单已设置为self.ui_open_btn,我就无法再捕捉到任何released 信号。用户释放鼠标时如何隐藏菜单?如何通过释放鼠标来触发菜单上的动作?
---添加---
我发现使用QToolButton 的另一个问题:按下按钮时菜单总是弹出。相反,我想捕捉pressed 信号,做一些检查以确定菜单是否应该弹出。所以我改变了编写自定义工具按钮的方法,将QPushButton 和QMenu 子类化。请在下面的答案中查看我的代码。
谢谢。
【问题讨论】:
-
您是否尝试使用
released信号隐藏菜单? -
@mguijarr:是的,我试过
self.ui_open_btn.menu().close()和self.ui_open_btn.menu().hide()。都没有奏效。我认为问题在于只要菜单设置为self.ui_open_btn,我就无法再捕捉到任何released信号。
标签: qt pyqt mouseevent qpushbutton qmenu