装饰连接信号和槽
使用PyQt Designer完成界面设计,例如添加一个QPushButton, 其名称为pushButton,生成相应的py文件打开后,可以看到代码代码中会有相应控件的名称设置语句和建立信号和槽的连接语句,如:
... self.pushButton.setObjectName("pushButton") ... QtCore.QMetaObject.connectSlotsByName(Form) ...
此时,在代码文件中,直接使用装饰器可以直接建立默认信号与槽函数之间的连接,从而实现代码与界面之间的逻辑关联。
同样,我们也可以的连接方式也可以在代码中直接实现。
所谓装饰信号和槽,就是通过装饰方法定义信号和槽函数,具体使用方法如下:
@PyQt5.QtCore.pyqtSlot(参数) def on_发送对象的名称_发射信号名称(self, 参数): pass
注:使用该方法的有效前提是已执行以下函数:
QMetaObject.connectSlotsByName(QObject)
在上述代码中,使用发送者对象名称setObjectName函数设置的名称,因此自定义槽函数的命名规则也可以看做:on 使用setObjectName设置的名称 信号名称。例如,创建了一个QPushButton, 使用setObjectName设置的名称是pushButton, 现在我们需要这样做clicked信号连接槽函数,采用装饰方式,相应的槽函数如下:
def on_pushButton_clicked(self): pass
测试代码
在测试代码中创建一个QPushButton按钮设置对象名称buttonTest, 单击按钮,弹出按钮被点击的消息。在这里对应的槽函数名称为on_buttonTest_clicked()完整代码如下:
importsys fromPyQt5importQtCore,QtGui,QtWidgets fromPyQt5.QtCoreimportQMetaObject fromPyQt5.QtWidgetsimport(QApplication,QWidget,QVBoxLayout, QPushButton,QMessageBox) classDemoSlotsByName(QWidget): def__init__(self,parent=None): super(DemoSlotsByName,self).__init__(parent) #设置窗口标题 self.setWindowTitle('实战PyQt5:信号和槽装饰器连接方式') #设置窗口大小 self.resize(300,200) self.initUi() definitUi(self): mainLayout=QVBoxLayout() btnTest=QPushButton(测试,self) #设置对象名称 btnTest.setObjectName('buttonTest') btnTest.setMinimumHeight(60) mainLayout.addWidget(btnTest) self.setLayout(mainLayout) ##装饰信号槽的连接必须执行这句话 QMetaObject.connectSlotsByName(self) @QtCore.pyqtSlot() defon_buttonTest_clicked(self): QMessageBox.information(self,'信息',点击测试按钮 if__name__=='__main__': app=QApplication(sys.argv) window=DemoSlotsByName() window.show() sys.exit(app.exec())
注:槽函数前必须添加信号指定 @QtCore.pyqtSlot()强制将信号处理函数转换为槽(slot),否则,槽函数可能无法正确运行。
试验结果如下图所示:
测试装饰方式的信号和槽连接
本文知识点
- 用装饰器连接信号和槽;
- 槽函数格式说明。
前一篇:实战PyQt5: 092-信号和槽传输额外参数