pyqt5信号槽使用教程,pyqt 信号与槽

  pyqt5信号槽使用教程,pyqt 信号与槽

  而信号槽是一个高层接口,应用于对象之间的通信。是QT的核心特性,也是QT区别于其他工具包的重要地方。所有继承qwidget的控件都支持信号和插槽机制。本文向大家介绍了PyQt5信号和插槽机制的相关知识,有兴趣的朋友来看看吧。

  信号和插槽机制是QT的核心机制。要掌握QT编程,就要对信号和槽有所了解。而信号槽是一个高层接口,应用于对象之间的通信。是QT的核心特性,也是QT区别于其他工具包的重要地方。

  而信号槽是用来在对象之间传递数据的方法:当特定事件发生时,会发出信号,用槽调用来响应相应的信号。Qt对象已经包含了很多预定义的信号(基础组件都有自己的预定义信号),可以根据使用场景添加新的信号。Qt在同一个对象中已经包含了很多预定义的槽函数,但是也可以根据使用的场景添加新的槽函数。

  

一、概念简介

 

  所有继承qwidget的控件都支持信号与槽机制。

  当信号:信号发生变化时,向外界发出的信息。

  当一个信号被发送时,与之相关的插槽功能被立即执行。其中对象只负责发送信号,发送信号的对象不知道哪个对象正在接收信号。这确保了对象之间的低耦合。

  如果存在与多个槽函数相关联的信号,则当信号被传输时,这些槽的执行顺序将是随机的和不确定的。

  槽:执行特定操作的函数或方法。

  当连接到该插槽的信号被发送时,该插槽将被调用。插槽不知道是否有任何信号连接到它。

  有两种主要的信号与槽机制:.

  手动操作:信号连接槽

  自动操作:当信号发出时,连续槽功能将自动执行。

  信号连接

  通过调用QObject对象的connect函数,将一个对象的信号与另一个对象的slot函数关联起来,这样当发送方发送信号时,就会调用接收方的slot函数。该函数定义如下:

  对象。信号。缝隙功能

  当信号不需要与插槽保持关联时,可以使用断开功能来断开连接。其定义如下:

  断开连接(插槽功能)

  信号和槽的特点:

  1.一个信号可以连接多个插槽:当信号发出时,插槽函数都会被调用,但调用顺序是随机的,不确定的。

  2.多个信号可以连接到同一个插槽:当任何信号发出时,插槽功能将被执行。

  3.信号的参数可以是任何python类型,比如list、dict和其他特定于Python的类型。定制信号时举例说明。

  4.信号和插槽之间的连接可以被移除:例如断开特定信号的关联。

  5.一个信号可以与另一个信号相关联:在发送第一个信号之后,同时发送第二个信号。例如,在发送关闭系统的信号之后,将同时发送保存数据的信号。

  

二、代码样例

 

  整体代码如下:

  导入系统

  来自PyQt5。QtCore导入

  来自PyQt5。QtWidgets导入(QWidget,QLCDNumber,QSlider,QGridLayout,QLabel,QHBoxLayout,QGroupBox,

  QVBoxLayout、QApplication、QProgressBar、QPushButton、QMessageBox)

  类别信号插槽(QWidget):

  def __init__(self):

  超级(信号槽,自身)。__init__()

  self.initUI()

  def initi(self):

  Self.controlsGroup=QGroupBox(运行示例)

  self.lcdNumber=QLCDNumber(self)

  self.slider=QSlider(Qt。水平,自身)

  self.pBar=QProgressBar(self)

  vbox=QVBoxLayout()

  vbox.addWidget(self.pBar)

  vbox.addWidget(self.lcdNumber)

  vbox.addWidget(self.slider)

  self . controls group . set layout(vbox)

  控制键

  ut = QGridLayout()

   self.label1 = QLabel("保存状态:")

   self.saveLabel = QLabel()

   self.label2 = QLabel("运行状态:")

   self.runLabel = QLabel()

   self.buttonSave = QPushButton("保存")

   self.buttonRun = QPushButton("运行")

   self.buttonStop = QPushButton("停止")

   self.buttonDisconnect = QPushButton("解除关联")

   self.buttonConnect = QPushButton("绑定关联")

   controlsLayout.addWidget(self.label1,0,0)

   controlsLayout.addWidget(self.saveLabel,0,1)

   controlsLayout.addWidget(self.label2,1,0)

   controlsLayout.addWidget(self.runLabel,1,1)

   controlsLayout.addWidget(self.buttonSave,2,0)

   controlsLayout.addWidget(self.buttonRun,2,1)

   controlsLayout.addWidget(self.buttonStop,2,2)

   controlsLayout.addWidget(self.buttonDisconnect,3,0)

   controlsLayout.addWidget(self.buttonConnect,3,1)

   layout = QHBoxLayout()

   layout.addWidget(self.controlsGroup)

   layout.addLayout(controlsLayout)

   self.setLayout(layout)

   self.buttonRun.clicked.connect(self.buttonSave.clicked)

   self.slider.valueChanged.connect(self.pBar.setValue)

   self.slider.valueChanged.connect(self.lcdNumber.display)

   self.buttonSave.clicked.connect(self.showMessage)

   self.buttonRun.clicked.connect(self.showMessage)

   self.buttonDisconnect.clicked.connect(self.unbindConnection)

   self.buttonConnect.clicked.connect(self.bindConnection)

   self.buttonStop.clicked.connect(self.stop)

   self.setGeometry(300, 500, 500, 180)

   self.setWindowTitle(信号和槽)

   def showMessage(self):

   if self.sender().text() == "保存":

   self.saveLabel.setText("Saved")

   elif self.sender().text() == "运行":

   self.runLabel.setText("Running")

   def unbindConnection(self):

   self.slider.valueChanged.disconnect()

   def bindConnection(self):

   def stop(self):

   self.saveLabel.setText("")

   self.runLabel.setText("")

  if __name__ == __main__:

   app = QApplication(sys.argv)

   ex = SignalSlot()

   ex.show()

   sys.exit(app.exec_())

  控件说明:

  控件类型控件名称作用controlsGroupQGroupBox为构建分组框提供了支持。分组框通常带有一个边框和一个标题栏,作为容器部件来使用,在其中可以布置各种窗口部件。lcdNumberQLCDNumber用于显示一个带有类似液晶显示屏效果的数字。sliderQSlider提供一个垂直或者水平的滑动条,滑动条是一个用于控制有界值典型的控件,它允许用户沿水平或者垂直方向在某一范围内移动滑块,并将滑块所在的位置转换为一个合法范围内的整数值pBarQProgressBar提供了一个水平或垂直的进度条label1QLabel

  • 占位符

  • 显示文本

  • 显示图片

  • 放置gif动画

  • 超链接

  • 提示标记

buttonSaveQPushButton常用的按钮控件

 

  界面说明:

  程序样本运行的界面逻辑,先设定运行的程序样本数量,然后先保存后运行的逻辑状态。通过slider的滑动来改变progressBar和LCD的显示数据;保存按钮保存运行的样本;运行按钮运行程序样本;解除关联解除slider.valueChanged信号的绑定,此时slider的滑动,不会改变progressBar和LCD的显示。

  

self.controlsGroup = QGroupBox("运行样本")

 

  实例化一个QGroupBox,在其中添加QProgressBar、QLCDNumber、QSlider控件。

  

controlsLayout = QGridLayout()

 

  通过QGridLayout()添加标签以及按钮。

  

layout = QHBoxLayout()

 

  最后通过QHBoxLayout将左右两个界面合并,形成最终界面。

  信号与槽说明:

  signal和slot进行绑定。
1.一个信号绑定多个槽:

  

self.slider.valueChanged.connect(self.pBar.setValue)

 

  slider控件的valueChanged信号,同时与QProgressBar的setValue(),QLCDNumber的display()槽函数绑定,当valueChanged信号触发的时候,这两个槽函数均会被调用。

  2.多个信号绑定到一个槽:

  

self.buttonSave.clicked.connect(self.showMessage)

 

  buttonSave和buttonRun这两个对象的clicked信号,同时绑定到showMessage()这个槽函数。无论哪一个信号被触发,showMessage()这个槽函数均会被调用,而根据self.sender().text() 这个函数来判断显示的不同内容。

  3.信号和槽的连接可以被移除:

  

self.buttonDisconnect.clicked.connect(self.unbindConnection)

 

  当buttonDisconnect信号触发之后,与其关联的槽函数unbindConnection()中就会执行disconnect()方法,如下:

  

def unbindConnection(self):

 

  其中执行disconnect()的时候可以指定解除与某个特定的slot槽的关联,比如self.slider.valueChanged.disconnect(self.pBar.setValue),此时解除和QProgressBar的setValue()的关联,如果不指定,将解除和这个信号所有关联的槽。

  4、信号与信号的关联:

  

self.buttonRun.clicked.connect(self.buttonSave.clicked)

 

  在样例说明中提到,在运行之前要对样本进行保存,所以为了保证运行的时候执行了保存的操作,所以将buttonRun.clicked信号和buttonSave.clicked信号关联起来。

  示例中在没有执行保存(buttonSave)的时候,执行运行(buttonRun),此时由于两个对象的clicked信号已经关联,所以buttonSave的clicked同样会执行。

  最终结果:

  

 

  本文是《从零开始学PyQt5》第五篇,希望小伙伴们可以多多支持,一起学习!

  参考:

  Pyqt5系列(七)-信号与槽机制_追逐阳光的风-CSDN博客_pyqt5信号和槽

  到此这篇关于PyQt5信号与槽机制案例详解的文章就介绍到这了,更多相关PyQt5信号与槽机制内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: