You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide2/Qt5中无法通过Action悬浮槽设置状态栏问题求助

PySide2中QAction悬浮时状态栏无法显示提示的解决方案

当鼠标悬浮在菜单的QAction上时,希望在状态栏显示自定义提示,但使用hovered信号连接处理函数时,仅能清空状态栏,无法设置目标内容。

问题根源

  1. 未设置Action的tooltip:原代码中未调用action.setToolTip(),导致action.toolTip()为空,处理函数直接进入清空分支。
  2. QMenuBar默认行为冲突:QMenuBar会自动处理菜单项悬浮时的状态栏提示,可能覆盖自定义的showMessage调用。

方案1:设置Tooltip并禁用菜单默认状态栏提示

先给QAction添加tooltip,然后禁用菜单的默认状态栏提示功能,再通过hovered信号和菜单的离开事件控制状态栏内容:

from PySide2.QtWidgets import QApplication, QMainWindow, QAction, QStatusBar

app = QApplication([])

main_window = QMainWindow()

# 创建Action并设置tooltip内容
action = QAction("My Action", main_window)
action.setToolTip("这是我的操作提示信息")

menu_bar = main_window.menuBar()
menu_bar.addAction(action)
# 禁用菜单的默认状态栏提示行为
menu_bar.setStatusTipVisible(False)

status_bar = QStatusBar(main_window)
init_msg = "Initialized."
status_bar.showMessage(init_msg)
main_window.setStatusBar(status_bar)

def update_status_bar():
    if action.isEnabled() and action.toolTip():
        status_bar.showMessage(action.toolTip())

def reset_status_bar():
    status_bar.showMessage(init_msg)

# 连接Action的悬浮信号
action.hovered.connect(update_status_bar)
# 处理菜单的鼠标离开事件,恢复初始状态栏消息
menu_bar.leaveEvent = lambda event: reset_status_bar()

main_window.show()
app.exec_()

方案2:使用事件过滤器拦截鼠标事件

通过给菜单项安装事件过滤器,直接拦截鼠标进入/离开事件,更可靠地控制状态栏内容:

from PySide2.QtWidgets import QApplication, QMainWindow, QAction, QStatusBar, QMenuBar
from PySide2.QtCore import QEvent, QObject

app = QApplication([])

main_window = QMainWindow()

action = QAction("My Action", main_window)
action.setToolTip("这是我的操作提示信息")

menu_bar = main_window.menuBar()
menu_bar.addAction(action)

status_bar = QStatusBar(main_window)
init_msg = "Initialized."
status_bar.showMessage(init_msg)
main_window.setStatusBar(status_bar)

class MenuHoverFilter(QObject):
    def __init__(self, status_bar, init_msg):
        super().__init__()
        self.status_bar = status_bar
        self.init_msg = init_msg

    def eventFilter(self, obj, event):
        if event.type() in (QEvent.Enter, QEvent.MouseMove):
            action = obj.action()
            if action and action.toolTip():
                self.status_bar.showMessage(action.toolTip())
        elif event.type() == QEvent.Leave:
            self.status_bar.showMessage(self.init_msg)
        return super().eventFilter(obj, event)

# 给每个菜单项安装事件过滤器
hover_filter = MenuHoverFilter(status_bar, init_msg)
for action in menu_bar.actions():
    widget = menu_bar.widgetForAction(action)
    if widget:
        widget.installEventFilter(hover_filter)

main_window.show()
app.exec_()

内容的提问来源于stack exchange,提问作者Eduardo Reis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:24:58