QMainWindow状态栏无法正常显示消息:QMenu hovered信号连接异常求助
问题出在你连接QMenu的hovered信号时,未处理参数为None的情况:当鼠标悬停在菜单栏上的"menu"按钮(未展开菜单)时,QMenu的hovered信号会触发,但此时传递的参数是None,调用a.text()会抛出AttributeError,导致整个信号槽连接失效,后续悬停菜单项时也无法正常触发。
修复方案
方案一:在lambda中添加参数校验
直接修改信号连接的lambda表达式,判断参数是否有效后再执行操作:
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.file_menu = QMenu("menu") # 添加参数非空判断 self.file_menu.hovered.connect(lambda a: self.statusBar().showMessage(a.text()) if a else None) self.open_action = QAction("open") self.file_menu.addAction(self.open_action) self.menuBar().addMenu(self.file_menu)
方案二:为单个QAction绑定hovered信号
QAction自身也有hovered信号(无参数),可以为每个菜单项单独连接槽函数,直接绑定对应文本:
from functools import partial class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.file_menu = QMenu("menu") self.open_action = QAction("open") # 使用partial绑定消息文本 self.open_action.hovered.connect(partial(self.statusBar().showMessage, "open")) self.file_menu.addAction(self.open_action) self.menuBar().addMenu(self.file_menu)
或者自定义槽函数处理:
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.file_menu = QMenu("menu") self.open_action = QAction("open") self.open_action.hovered.connect(lambda: self._show_status_message(self.open_action.text())) self.file_menu.addAction(self.open_action) self.menuBar().addMenu(self.file_menu) def _show_status_message(self, text): self.statusBar().showMessage(text)
内容的提问来源于stack exchange,提问作者Poison
相关产品推荐
相关产品推荐

