PYQT学习之自定义信号
Posted mosewumo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PYQT学习之自定义信号相关的知识,希望对你有一定的参考价值。
记录自定义信号创建和使用
1.信号的定义:在类内部,以类属性形式定义;pyqtSignal([int],[str])
注意:一个信号连接另外一个信号时,必需保证参数类型和个数一致。
下文以一个右击按钮信号demo示例
from PyQt5.Qt import * # 自定义信号按键方法程序 class Btn(QPushButton): rightClicked = pyqtSignal([str],[int, str]) #设置自定义信号函数pyqtSignal在使用时默认传递一个参数,可以使用[int, str...]传递多个参数 def mousePressEvent(self, evt): super(Btn, self).mousePressEvent(evt) #一定要使用super,因为程序先看子类方法再去看父类方法,子类方法覆盖了 #父类方法,会到导致mousePressEvent()的其他方法无法使用 #evt:事件对象 if evt.button() == Qt.RightButton: print(‘应该发射右击信号‘) self.rightClicked[str].emit(self.text()) #传递值,默认是pyqtSignal的第一个参数,可以加[str]确定传送目标值 self.rightClicked[int, str].emit(888,‘xuexi‘) # emit:确保自定义信号的发射,保证槽函数正确使用 class Window(QWidget): def __init__(self): super(Window, self).__init__() self.setWindowTitle(‘自定义信号‘) self.resize(500,500) self.setup_ui() def setup_ui(self): btn = Btn(‘xx‘,self) # 继承自定信号类 btn.rightClicked[int, str].connect(lambda content, c2:print("按钮右键被点击了", content, c2)) btn.pressed.connect(lambda :print("按钮被按下")) if __name__ == ‘__main__‘: import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
案例二:连接一个槽函数
from PyQt5.Qt import * # 自定义信号按键方法程序 class Btn(QPushButton): rightClicked = pyqtSignal() # 设置自定义信号函数pyqtSignal在使用时默认传递一个参数,可以使用[int, str...]传递多个参数 def mousePressEvent(self, evt): super(Btn, self).mousePressEvent(evt) # 一定要使用super,因为程序先看子类方法再去看父类方法,子类方法覆盖了 # 父类方法,会到导致mousePressEvent()的其他方法无法使用 # evt:事件对象 if evt.button() == Qt.RightButton: print(‘应该发射右击信号‘) self.rightClicked.emit() class Window(QWidget): def __init__(self): super(Window, self).__init__() self.setWindowTitle(‘自定义信号‘) self.resize(500, 500) self.setup_ui() def cao(self): print(‘lianjie‘) def setup_ui(self): btn = Btn(‘xx‘, self) # 继承自定信号类 btn.rightClicked.connect(self.cao) if __name__ == ‘__main__‘: import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
2.利用装饰器自动连接信号与槽
核心函数:QMetaObject.connectSlotsByName(obj);@pyqtSlot()
from PyQt5.Qt import * class Window(QWidget): def __init__(self): super(Window, self).__init__() self.setWindowTitle(‘装饰器连接信号与槽的学习‘) self.resize(500,500) self.setup_ui() def setup_ui(self): btn = QPushButton(‘测试按钮‘,self) btn.setObjectName(‘btn‘) btn.resize(200,200) btn.move(100,100) btn2 = QPushButton("测试按钮2", self) btn2.setObjectName("btn2") btn2.resize(200, 200) btn2.move(100, 300) QMetaObject.connectSlotsByName(self) # 注意QMetaObject.connectSlotsByName(obj)一定要放在槽函数控件设置后 # 否则无法使用该方法 @pyqtSlot() # 将@pyqtSlot()放置在槽函数上 def on_btn_clicked(self): print(‘成功连接‘) # 槽函数格式为on_ObjectName(控件设置的setObjectName)_信号 if __name__ == ‘__main__‘: import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
自定义信号和装饰器连用
from PyQt5.Qt import * class Btn(QPushButton): rightClicked = pyqtSignal() #设置自定义信号函数pyqtSignal在使用时默认传递一个参数,可以使用[int, str...]传递多个参数 def mousePressEvent(self, evt): super(Btn, self).mousePressEvent(evt) #一定要使用super,因为程序先看子类方法再去看父类方法,子类方法覆盖了 #父类方法,会到导致mousePressEvent()的其他方法无法使用 #evt:事件对象 if evt.button() == Qt.RightButton: print(‘应该发射右击信号‘) #传递值,默认是pyqtSignal的第一个参数,可以加[str]确定传送目标值 self.rightClicked.emit() # emit:信号的发射 class Window(QWidget): def __init__(self): super(Window, self).__init__() self.setWindowTitle(‘装饰器连接信号与槽的学习‘) self.resize(500,500) self.setup_ui() def setup_ui(self): btn = Btn(‘测试按钮‘,self) btn.setObjectName(‘btn‘) btn.resize(200,200) btn.move(100,100) btn2 = QPushButton("测试按钮2", self) btn2.setObjectName("btn2") btn2.resize(200, 200) btn2.move(100, 300) QMetaObject.connectSlotsByName(self) # 注意QMetaObject.connectSlotsByName(obj)一定要放在槽函数控件设置后 # 否则无法使用该方法 @pyqtSlot() # 将@pyqtSlot()放置在槽函数上 def on_btn_rightClicked(self): print(‘成功连接‘) # 槽函数格式为on_ObjectName(控件设置的setObjectName)_信号 if __name__ == ‘__main__‘: import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
以上是关于PYQT学习之自定义信号的主要内容,如果未能解决你的问题,请参考以下文章
PyQt5 控件学习(一个一个学习之QMessageBox)