装饰器实现信号和槽的连接
一、学习指导
使用装饰器来实现信号和槽之间的连接是一种技巧操作,对于特殊的开发环境和我们后期要学习到的Qt Designer有一定的帮助,难度也不大,所以单独给大家录制一节课,直接上代码,大家节课视频来看看。
二、代码演示
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("信号和槽") self.resize(600, 500) self.func_list() def func_list(self): self.func() self.on_btn_clicked() def func(self): btn = QPushButton('按钮', self) btn.setObjectName('btn') btn.resize(80, 50) btn.move(100, 100) btn2 = QPushButton('按钮', self) btn2.setObjectName('btn2') btn2.resize(80, 50) btn2.move(100, 200) # 表示把window对象中的子对象按照objectName链接到相关的槽函数上,必须放在所有子控件的最后 QMetaObject.connectSlotsByName(self) @pyqtSlot(bool) # 这里bool表示按钮有没有被选中 def on_btn_clicked(self): # 注意命名规则 print('点击按钮') if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
这里要注意的就是QMetaObject.connectSlotsByName(self)一定要放在所有控件对象的后边,否则无法识别连接,最起码要放在需要装饰的控件对象后面。
被装饰器装饰的代码我们可以改写成下面这段。
self.btn.clicked[bool].connect(self.btn_clicked) def btn_clicked(self): print('点击按钮')