iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >PyQt5信号与槽机制案例详解
  • 740
分享到

PyQt5信号与槽机制案例详解

2024-04-02 19:04:59 740人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

信号和槽机制是 Qt 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要

信号和槽机制是 Qt 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。

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

一、概念简介

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

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

当一个信号被发射的时候,与其关联的槽函数被立刻执行。其中该对象只负责发送信号,发射该信号的对象并不知道是那个对象在接收这个信号。这样保证了对象与对象之间的低耦合。
如果存在信号和多个槽函数相关联的时候,当信号被发射时,这些槽的执行顺序将会是随机的、不确定的。

槽:一个执行某些操作的函数或者方法。

当和槽连接的信号被发射时,槽会被调用。一个槽并不知道是否有任何信号与自己相连接。

信号与槽机制:主要分两种

手动操作:信号连接槽

自动操作:当信号发出时,连续的槽函数会自动执行

信号连接

通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:

object.信号.connet(槽函数)

当信号与槽没有必要继续保持关联时,可以使用 disconnect 函数来断开连接。其定义如下:

disconnect(槽函数)

信号和槽的特点:

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

2.多个信号可以连接到同一个槽:其中任何一个信号发出,槽函数都会被执行。

3.信号的参数可以是任何的python类型,如list,dict等Python独有的类型。自定义信号的时候举例说明。

4.信号和槽的连接可以被移除:比如断开某个特定信号的关联。

5.信号可以和另外一个信号进行关联:第一个信号发出后,第二个信号也同时发送。比如关闭系统的信号发出之后,同时会发出保存数据的信号。

二、代码样例

整体代码如下:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,QGridLayout,QLabel,QHBoxLayout, QGroupBox,
    QVBoxLayout, QApplication,QProgressBar,QPushButton,QMessageBox)
 
class SignalSlot(QWidget):
    def __init__(self):
        super(SignalSlot,self).__init__()      
        self.initUI()
    def initUI(self):
        self.controlsGroup = QGroupBox("运行样本")
        self.lcdNumber = QLCDNumber(self)
        self.slider = QSlider(Qt.Horizontal, self)
        self.pBar = QProgressBar(self)
        vbox = QVBoxLayout()
        vbox.addWidget(self.pBar)
        vbox.addWidget(self.lcdNumber)
        vbox.addWidget(self.slider)
        self.controlsGroup.setLayout(vbox)
        controlsLayout = 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("运行样本")
self.lcdNumber = QLCDNumber(self)
self.slider = QSlider(Qt.Horizontal, self)
self.pBar = QProgressBar(self)
vbox = QVBoxLayout()
vbox.addWidget(self.pBar)
vbox.addWidget(self.lcdNumber)
vbox.addWidget(self.slider)
self.controlsGroup.setLayout(vbox)

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

controlsLayout = 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)

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

layout = QHBoxLayout()
layout.addWidget(self.controlsGroup)
layout.addLayout(controlsLayout)
self.setLayout(layout)

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

信号与槽说明:

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

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

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

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

self.buttonSave.clicked.connect(self.showMessage)
self.buttonRun.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):
        self.slider.valueChanged.disconnect()

其中执行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信号与槽机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PyQt5信号与槽机制案例详解

本文链接: https://www.lsjlt.com/news/142082.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PyQt5信号与槽机制案例详解
    信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要...
    99+
    2024-04-02
  • 深入理解Qt信号槽机制
    目录1. 信号和槽概述1.1 信号的本质1.2 槽的本质1.3 信号和槽的关系1. 信号和槽概述 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订阅模...
    99+
    2024-04-02
  • python PyQt5(自定义)信号与槽使用及说明
    目录1 定义信号2 定义槽函数3 连接信号与槽函数4 发射信号5 实例自定义参数的传递及实例lamdba表达式实例总结所谓PyQt5高级自定义信号与槽,指的就是我们可以以自己喜欢的方...
    99+
    2022-12-16
    python PyQt5 PyQt5信号 PyQt5槽使用
  • qt信号与槽机制的原理是什么
    Qt的信号与槽(Signals and Slots)机制是Qt的一个重要特性,用于处理对象之间的事件通信。它的原理基于C++的特性和...
    99+
    2023-09-27
    qt
  • Python深度学习实战PyQt5信号与槽的连接
    目录1. 信号与槽(Signals and slots)1.1 信号与槽的原理1.2 信号发送者与槽的接收者2. QtDesigner 建立信号与槽的连接2.1 信号与槽的连接:不同...
    99+
    2024-04-02
  • 详解c++实现信号槽
    目录用c++实现信号槽机制(signal-slot)总结用c++实现信号槽机制(signal-slot) 信号槽机制的个人理解:信号槽是在两个c++类对象之间建立联系的通道,其中一...
    99+
    2024-04-02
  • PHP autoload机制案例详解
    PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这10...
    99+
    2024-04-02
  • python中装饰器信号与槽的示例分析
    这篇文章主要为大家展示了“python中装饰器信号与槽的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中装饰器信号与槽的示例分析”这篇文章吧...
    99+
    2024-04-02
  • 微信小程序的运行机制与安全机制解决方案详解
    目录了解小程序的由来小程序与普通网页开发的区别小程序运行机制小程序更新机制小程序安全1.反编译2.接口鉴权3.代码管理4.内容安全5.敏感数据安全小程序双线程架构为什么要选择双线程架...
    99+
    2023-02-09
    小程序的运行机制 小程序的安全机制
  • C++之&与*符号用法案例详解
    C++ 之 & 和 * 1.基本概念与二者区别 指针是一块内存的地址值,而引用是一块内存的别名。 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它...
    99+
    2024-04-02
  • Flutter与WebView通信方案示例详解
    目录背景WebView组件选择webview_flutter通信方式调研Flutter -> WebView通信方式问题WebView -> Flutter通信方式JSB...
    99+
    2023-01-04
    Flutter WebView通信方案 Flutter WebView
  • linux信号解释(3)--信号处理机制
        如果需要进程捕获某个信号,并作出相应的处理,就需要注册信号处理函数(其实就是内核里需要识别信号函数,类似C语言里的include某函数库)。    处理信号就类似软中断,内核为每个进程准备了一段信号向量表,记录信号的处理机制。当某个...
    99+
    2023-01-31
    信号处理 信号 机制
  • Java page cache回写机制案例详解
    JAVA写文件的基本流程 在不使用堆外内存的情况下,java在写文件时,先将字节写入JVM的堆内内存中;然后调用jvm的写文件函数,将字节写入jvm的堆外内存中,jvm再调用系统内核...
    99+
    2024-04-02
  • Python反射机制案例超详细讲解
    目录一、导包案例二、基础知识1、是什么2、怎么用三、使用案例一、导包案例 我们导入第三方库,可以使用import。那我们现在有一个需求,我需要动态输入一个模块名,然后导入,这应该怎么...
    99+
    2024-04-02
  • Go中groutine通信与context控制实例详解
    目录需求背景:Groutine的并发控制:Context:看看代码:总结需求背景: 项目中需要定期执行任务A来做一些辅助的工作,A的执行需要在超时时间内完成,如果本次执行超时了,那就...
    99+
    2024-04-02
  • 深入理解Django的信号机制
    目录Django的信号Django信号的使用自定义信号扩展:查看Django信号的接受者扩展:Django内置信号Django的信号 Django的信号机制不同于Linux的信号机制...
    99+
    2023-02-08
    Django 信号机制
  • Android Intent与IntentFilter案例详解
    1. 前言        在Android中有四大组件,这些组件中有三个组件与Intent相关,可见Intent在Android整个生态中的地...
    99+
    2024-04-02
  • PHP反射机制案例讲解
    简介 就算是类成员定义为private也可以在外部访问,不用创建类的实例也可以访问类的成员和方法。 PHP自5.0版本以后添加了反射机制,它提供了一套强大的反射API,允许你在PHP...
    99+
    2024-04-02
  • C++使用标准库实现事件和委托以及信号和槽机制
    目录1 .Net的委托和事件2.Qt的信号和槽3.Duilib中委托和事件4.使用C++标准库简单实现事件触发机制5.总结在日常的程序开发中我们经常会遇到以下的实际问题: 比如在一个...
    99+
    2022-11-13
    C++标准库实现事件委托 C++标准库实现信号 槽机制 C++ 标准库
  • Kotlin lateinit与by lazy案例详解
    lateinit 和 lazy 是 Kotlin 中的两种不同的延迟初始化的实现 lateinit 只用于变量 var,而 lazy 只用于常量 val lazy 应用于单例模式(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作