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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:15:26