上一篇介绍了PyQt预定义信号和预定义槽的连接。本篇讲解如何自定义槽,以及如何向槽传递额外的信号参数。
信号与槽连接的格式为: object.signal.connect(callable)
obeject为QObject任何派生类的实例(比如按钮),signal为object发射的信号(如点击事件clicked),callable为槽函数名(不能带括号,所以不能带参数)。例如:
button.clicked.connect(self.on_clicked)
def on_clicked(self):#在类中为方法,只带一个参数self;否则无参数
#do something
pass
可以为不同的信号编写不同的槽函数。但有时候为了简洁,需要将多个信号连接到同一个槽上,并需要根据连接的不同信号做出不同的响应,但是默认情况下槽函数不能传递参数,该如何做呢?
第一种方法:用 无参的lambda函数调用有参的事件处理函数
格式为: object.signal.connect(lambda :callable(para list))。
示例代码如下:建议在浏览器中打开并横屏观看。
# _*_ coding:utf-8_*_ #向槽函数传递额外参数 import sys from PyQt5.QtGui import * from PyQt5.QtWidgets import *
class MyWidget(QWidget): def __init__(self,parent = None): super().__init__(parent)# self.initUI() def initUI(self): btn1 = QPushButton("Button 1") btn2 = QPushButton("Button 2") self.label =QLabel() self.label.setFrameStyle(QFrame.Panel) layout = QGridLayout() layout.addWidget(btn1,0,0) layout.addWidget(btn2,0,1) layout.addWidget(self.label,1,0,1,2) btn1.clicked.connect(lambda : self.on_clicked(btn1))## btn2.clicked.connect(lambda : self.on_clicked(btn2))## self.setLayout(layout) self.resize(220,80) self.setWindowTitle(u'信号和槽')
def on_clicked(self,button):#带了额外参数## self.label.setText(u"%s 被点击"% button.text()) if __name__== '__main__': app= QApplication(sys.argv) widget= MyWidget() widget.show() #显示到屏幕 sys.exit(app.exec_())
第二种方法:使用偏函数来封装带参数的槽。下面仅列写代码的不同部分。
from functools import partial ## btn1.clicked.connect(partial(self.on_clicked,btn1))## btn2.clicked.connect(partial(self.on_clicked,btn2))##
第三种方法:在槽函数中使用self.sender()得到事件源。下面仅列写代码的不同部分。
btn1.clicked.connect(self.on_clicked)#不带参数 btn2.clicked.connect(self.on_clicked)#不带参数
def on_clicked(self):#不带额外参数## self.label.setText(u"%s 被点击"% self.sender().text())
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!