实战PyQt5: 093,第1张

装饰器连接信号与槽

使用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()。完整代码如下:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QMetaObject
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout,
 QPushButton, QMessageBox)
 
 
class DemoSlotsByName(QWidget): 
 def __init__(self, parent=None):
 super(DemoSlotsByName, self).__init__(parent) 
 
 # 设置窗口标题
 self.setWindowTitle('实战PyQt5: 信号和槽 装饰器连接方式') 
 # 设置窗口大小
 self.resize(300, 200)
 
 self.initUi()
 
 def initUi(self):
 
 mainLayout = QVBoxLayout()
 
 btnTest = QPushButton('测试', self)
 #设置对象名称
 btnTest.setObjectName('buttonTest')
 btnTest.setMinimumHeight(60)
 mainLayout.addWidget(btnTest) 
 
 self.setLayout(mainLayout)
 
 #使用装饰器信号槽连接方式必须执行这一句
 QMetaObject.connectSlotsByName(self)
 
  @QtCore.pyqtSlot()
 def on_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: 093,第2张

测试装饰器方式的信号和槽连接

本文知识点使用装饰器方式连接信号和槽;槽函数格式申明。

喜欢本文内容就关注, 收藏,点赞,评论和转发。


本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 实战PyQt5: 093

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情