网上关于 PyQt5 的信号绑定使用的教程比较上,很多还是以前的绑定方式,导致在 PyQt5 中无法使用,这里归纳总结下已有的几种绑定信号槽的方式,
这几种方式各有各的优点和缺点。

# 方式一

这个方式是最开始接触设计师的时候知道的,主要是通过控件的 objectNameQtCore.QMetaObject.connectSlotsByName(Form) 提供的连接函数来自动完成注册,
比如带有按钮的界面 ui 文件转成 py 文件后会发现如下代码:

self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(60, 40, 93, 28))
self.pushButton.setObjectName("pushButton")

# 通过这里自动完成连接信号槽
QtCore.QMetaObject.connectSlotsByName(Form)

此时只需要继承该 UI 文件类然后增加如下方法:


@pyqtSlot()
def on_pushButton_clicked(self):
    print('button clicked')

这里解释一下, @pyqtSlot() 装饰器把函数 on_pushButton_clicked 包装为一个槽函数,
QtCore.QMetaObject.connectSlotsByName(Form) 这句代码的意思就是自动去寻找满足的槽函数

注意:这里有个规范(on_xxxx_clicked),这里必须要满足 on_控件的objectName_控件的信号 这样下划线连接起来的函数名才能被识别,
比如按钮的点击: on_pushButton_clicked 、勾选框的选中: on_checkbox_toggled(self, checked)

# 方式二

这种方式则直接通过代码里调用控件的信号的 connect 方法来进行绑定,比如:

# 按钮点击函数
def doClicked(self):
    print(self.sender(), 'clicked')

# 绑定点击信号
self.pushButton.clicked.connect(self.doClicked)

注意: connect 的是函数名字self.sender() 这句代码是获取信号发送者(比如这里就是得到这个按钮对象),
用处在于有时候要循环创建一堆按钮

# 方式三

通过参数这种方式其实比较特殊,在 PyQt 中大部分存在,但是在 PySide 中则很少,原因是两者的封装方式不同。

同时该方式用于在纯代码中比较常见,而且需要对该控件有那些信号可以用要很熟习,比如:


# 按钮点击函数
def doClicked(self):
    print(self.sender(), 'clicked')

pushButton = QPushButton('按钮', self, clicked=self.doClicked, minimumHeight=40)

这里可以通过参数(信号名字) = 函数来绑定信号

同时也可以设置其它参数,比如
button.setMinimumHeight(40) 也可以像参数里那样设置 minimumHeight=40