控件发射的信号指定槽函数的三种方法:
- 在窗口的UI设计中操作添加信号和槽
- 通过代码连接信号和槽
- 通过Eric的“生成对话框代码”的功能产生信号和槽
使用pyqtSignal()函数创建一个或多个重载的未绑定的信号作为类的属性,信号只能在QObject的子类中定义。
信号必须在类创建时定义,不能在类创建后作为类的动态属性加进来。
信号与槽的三种使用方法:
- 内置信号与槽的使用
- 自定义信号与槽的使用
- 装饰器的信号与槽的使用
使用自定义参数
信号发出的参数个数一定要大于槽函数接收的参数个数
"""
【简介】
部件中的信号槽传递,使用lambda表达式传参数示例
"""
from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout
import sys
class WinForm(QMainWindow):
def __init__(self, parent=None):
super(WinForm, self).__init__(parent)
self.setWindowTitle("信号和槽传递额外参数例子")
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')
button1.clicked.connect(lambda: self.onButtonClick(1))
button2.clicked.connect(lambda: self.onButtonClick(2))
layout = QHBoxLayout()
layout.addWidget(button1)
layout.addWidget(button2)
main_frame = QWidget()
main_frame.setLayout(layout)
self.setCentralWidget(main_frame)
def onButtonClick(self, n):
print('Button {0} 被按下了'.format(n))
QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))
if __name__ == "__main__":
app = QApplication(sys.argv)
form = WinForm()
form.show()
sys.exit(app.exec_())
装饰器信号与槽
这种方法有效的前提是下面的函数已经执行:
QMetaObject.connectSlotsByName(QObject)
"""
【简介】
信号和槽的自动连接例子
"""
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication ,QWidget ,QHBoxLayout , QPushButton
import sys
class CustWidget( QWidget ):
def __init__(self, parent=None):
super(CustWidget, self).__init__(parent)
self.okButton = QPushButton("OK", self)
#使用setObjectName设置对象名称
self.okButton.setObjectName("okButton")
layout = QHBoxLayout()
layout.addWidget(self.okButton)
self.setLayout(layout)
QtCore.QMetaObject.connectSlotsByName(self)
@QtCore.pyqtSlot()
def on_okButton_clicked(self):
print( "点击了OK按钮")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = CustWidget()
win.show()
sys.exit(app.exec_())