Qt6+Python加载.ui文件报错:QMainWindow无clickedNewConn槽
解决Qt6+Python中自定义槽无法关联的问题
报错原因
你在Qt Designer中给MainWindow配置的clickedNewConn槽,是基于Qt的C++元对象系统设计的,但直接用QUiLoader加载时,生成的QMainWindow实例并没有这个方法——即使你传入自定义类作为parent,这个parent只是窗口的父控件,而非让生成的窗口继承你的自定义类,因此Qt找不到对应的槽函数。
两种可行解决方案
方案1:动态加载UI(无需生成Python类文件)
通过uic.loadUi直接加载.ui文件,让自定义类继承QMainWindow,并在类中实现槽方法,可选择手动关联或通过Qt Designer配置:
手动关联信号槽(无需在Qt Designer中配置)
from PyQt6.QtWidgets import QMainWindow, QApplication from PyQt6 import uic import sys class MyMainWindow(QMainWindow): def __init__(self): super().__init__() # 加载UI文件到当前类实例 uic.loadUi("mainwindow.ui", self) # 手动关联按钮点击信号到自定义槽 self.pushButton.clicked.connect(self.clickedNewConn) def clickedNewConn(self): print("Hello World!") if __name__ == "__main__": app = QApplication(sys.argv) window = MyMainWindow() window.show() sys.exit(app.exec())
通过Qt Designer配置信号槽
如果要保留Qt Designer中的信号槽配置,需要用@pyqtSlot()装饰器标记槽方法,让Qt元对象系统识别:
from PyQt6.QtWidgets import QMainWindow, QApplication from PyQt6 import uic from PyQt6.QtCore import pyqtSlot import sys class MyMainWindow(QMainWindow): def __init__(self): super().__init__() uic.loadUi("mainwindow.ui", self) @pyqtSlot() def clickedNewConn(self): print("Hello World!") if __name__ == "__main__": app = QApplication(sys.argv) window = MyMainWindow() window.show() sys.exit(app.exec())
此时在Qt Designer的Signal/Slot Editor中,将pushButton->clicked()关联到MainWindow->clickedNewConn()即可正常工作。
方案2:生成UI对应的Python类文件
先通过命令行将.ui文件转换为Python类:
pyuic6 mainwindow.ui -o ui_mainwindow.py
然后让自定义类继承生成的UI类和QMainWindow,实现槽方法:
from PyQt6.QtWidgets import QMainWindow, QApplication from ui_mainwindow import Ui_MainWindow import sys class MyMainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # 关联信号槽,或保留Qt Designer中的配置 self.pushButton.clicked.connect(self.clickedNewConn) def clickedNewConn(self): print("Hello World!") if __name__ == "__main__": app = QApplication(sys.argv) window = MyMainWindow() window.show() sys.exit(app.exec())
关于QUiLoader的补充
如果一定要用QUiLoader,需要自定义Loader类来创建你的自定义窗口实例,步骤繁琐且不推荐,日常开发优先选择上述两种基于uic的方案。
内容的提问来源于stack exchange,提问作者Moraes
相关产品推荐
相关产品推荐

