PyQt添加QToolBar时窗口不显示 报QObject::disconnect无对应slot错误
问题根因
报错和窗口无法显示的核心原因是组件类的继承关系完全错误:
- 自定义的
MenuBar、ToolBar类都错误使用了多继承,同时继承了QMainWindow和对应组件类(QMenuBar/QToolBar)。QMainWindow是顶层主窗口容器,自带菜单栏、工具栏、状态栏的专属管理逻辑,和普通子组件类的元对象逻辑冲突,直接导致Qt内部的信号槽连接失败,也就是控制台输出的「找不到对应私有槽」报错。 - 伴随的逻辑错误:两个组件类内部都错误调用了仅
QMainWindow才有的方法——MenuBar里调用self.menuBar()、ToolBar里调用self.addToolBar(),相当于在子组件内部又执行了一遍主窗口添加栏位的逻辑,完全不符合Qt的对象层级设计。
修复步骤
只需要修正两个自定义组件类的继承关系和内部逻辑即可,main.py和window.py不需要改动。
- 修正
menu.py- 移除对
QMainWindow的继承,MenuBar仅需继承QMenuBar - 移除冗余的
menubar = self.menuBar()调用,直接给当前菜单栏实例本身添加菜单项
修正后代码:
- 移除对
from PyQt5.QtWidgets import QMenuBar class MenuBar(QMenuBar): def __init__(self): super().__init__() self.fileMenu = "&File" self.editMenu = "&Edit" self.helpMenu = "&Help" self.initUI() def initUI(self): self.addMenu(self.fileMenu) self.addMenu(self.editMenu) self.addMenu(self.helpMenu)
- 修正
ToolBar.py- 移除对
QMainWindow的继承,ToolBar仅需继承QToolBar - 移除冗余的
toolBar = self.addToolBar("ToolBar")调用,self本身就是工具栏实例,直接设置属性、添加动作即可
注:原代码里工具栏按钮文本和菜单完全重复,这里顺手调整为符合工具栏功能的文本,可根据需求自行修改
修正后代码:
- 移除对
from PyQt5.QtWidgets import QToolBar, QAction class ToolBar(QToolBar): def __init__(self): super().__init__() self._createActions() self.initUI() def initUI(self): self.setMovable(False) self.addAction(self.compileAction) self.addAction(self.settingsAction) self.addAction(self.quitAction) def _createActions(self): self.compileAction = QAction(self) self.compileAction.setText("&Compile") self.settingsAction = QAction(self) self.settingsAction.setText("&Settings") self.quitAction = QAction(self) self.quitAction.setText("&Quit")
修改完成后重新运行main.py,窗口即可正常展示,菜单栏、工具栏都会正常加载,不会再出现信号槽相关报错。
内容的提问来源于stack exchange,提问作者mnekkach
相关产品推荐
相关产品推荐

