pyQt中的信号

1. 说明

  • 在调用 exec_()方法时,应用会进入主循环,而主循环会监听、处理事件
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
    QVBoxLayout, QApplication)

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        lcd = QLCDNumber(self)
        sld = QSlider(Qt.Horizontal, self)
        #布局
        vbox = QVBoxLayout()
        #向布局中添加组件
        vbox.addWidget(lcd)
        vbox.addWidget(sld)
        self.setLayout(vbox)
        #绑定
        sld.valueChanged.connect(lcd.display)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Signal and slot')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
  • QLCDNumber: 是一个仿LCD显示屏的qt组件
  • QSlider: 是qt滑块组件
  • sld.valueChanged.connect(lcd.display): 绑定语句。将滑块的数字变化(内置方法)用 connect()连接至lcd的显示(内置方法)
  • 本例中,事件发送者是 sld;事件接收者是 lcd

2. 事件处理器的重写

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Event handler')
        self.show()

    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            self.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
  • keyPressEvent: 是qt中预先定义好的类。在覆写时会保有原先定义的函数操作,若发生冲突,则以用户复写的内容为准。
  • 该程序逻辑为:若按下 ESC键,就调用 Qwidget中的 close()函数
  • (self, e): e是行为的接收者,是事件对象。不同的事件覆写类会产生相应不同的事件对象。 e.key()表示接收到的按键

3. 事件发送者的判断

import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #定义了两个按钮并确定其位置
        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)
        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)
        #两个函数的点击事件都绑定至本类中定义的方法,即若发生点击,就调用定义的函数
        btn1.clicked.connect(self.buttonClicked)
        btn2.clicked.connect(self.buttonClicked)
        #调用方法,创建了一个工具栏,在26行会用到
        self.statusBar()
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Event sender')
        self.show()

    def buttonClicked(self):
        #用QMainWindow中的sender()方法确定了发送者,并获得了发送者的title
        target = self.sender()
        self.statusBar().showMessage(target.text() + ' was pressed')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

4. 信号发送

常继承 QObject 类,调用其中的方法来发送信号
import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication

#定义类,继承自QObject,其中的pyqtSignal()用于发送信号。
class Communicate(QObject):
    #用pyqtSignal()申请信号变量closeApp
    closeApp = pyqtSignal()

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #创建了一个变量c,是一个含信号closeApp的对象
        self.c = Communicate()
        #将该信号与QMainWindow的close相绑定
        self.c.closeApp.connect(self.close)
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Emit signal')
        self.show()

    def mousePressEvent(self, event):
        #覆写了该类,有点击事件发生时,就发送c中的closeApp信号,信号会调用close
        self.c.closeApp.emit()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Original: https://www.cnblogs.com/dysonxxxxx/p/16582061.html
Author: dysonkkk
Title: pyQt中的信号

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578848/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 写shell,运行出错:syntax error near unexpected token `$’dor”

    【解决过程】 1.网上搜了下,参考:linux shell脚本报错:syntax error near unexpected token </a></p> …

    Linux 2023年5月28日
    094
  • 判断Redis复制是否完成的方法

    当需要使用Redis的复制功能时,有时需要能及时的得到复制完成的信息,或者说复制的进度。 Redis提供的INFO命令,可以提供redis运行时的各种信息。我们这里需要关注Repl…

    Linux 2023年5月28日
    0125
  • Identity Server 4使用OpenID Connect添加用户身份验证(三)

    一、说明 基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4资源拥有者密码认证控制访问API…

    Linux 2023年6月13日
    085
  • Redis

    Redis原创笑笑师弟 最后发布于2018-12-21 14:17:59 阅读数 1780 收藏展开目录 redis简介 redis功能 redis学习步骤 windows系统下的…

    Linux 2023年5月28日
    0107
  • Linux安装宝塔,OCI8,连接ORACLE数据库

    基础环境 centos7 安装BT宝塔 &#x7F51;&#x5740;&#xFF1A;https://www.bt.cn/download/linux.h…

    Linux 2023年6月6日
    0114
  • 4.1 打包和压缩的概念和区别

    在讲解具体的归档命令和压缩命令之前,先来了解一下归档和压缩所各自代表的含义。 归档,也称为打包,指的是一个文件或目录的集合,而这个集合被存储在一个文件中。归档文件没有经过压缩,因此…

    Linux 2023年6月7日
    098
  • 【网络安全篇】常见的HTTP状态码小结(3位5类)

    HTTP 状态码(HTTP Status Code)用以表示网页服务器传输协议的响应状态;状态码为 三位数,响应分为 五种;状态码的第1位数字表示状态类型,第2、3位数字表示具体的…

    Linux 2023年6月13日
    092
  • .Net Core下DllImport使用方法及扩展

    引言​ 在有时候的开发过程中,我们会遇到需要调用系统的API,不巧的是.Net Core可能没办法为我们提供相关的调用方式。那需要如何才能解决这个问题呢?​ 这时候我们就可能会考虑…

    Linux 2023年6月13日
    088
  • linux定时删除N天前的旧文件

    语句写法: find 对应目录 -mtime +天数 -name “文件名” -exec rm -rf {} \; 例1:find /usr/local/b…

    Linux 2023年6月13日
    0107
  • 手把手教你搭建一个SpringBoot工程

    手把手教你搭建一个SpringBoot工程 首先进入Spring官网,下载Demo工程 像这样设置好 点击下载 将工程导入Idea并打开 在 application.propert…

    Linux 2023年6月14日
    0123
  • 【Ubuntu】如何将Ubuntu软件源切换到国内源?

    为什么切换软件源? 当初次部署Ubuntu镜像时,会发现更新软件时速度非常慢,因为Ubuntu的软件都来自与国外,所下载或更新软件时的速度非常慢,此时就可以选择切换到国内的软件源来…

    Linux 2023年6月13日
    0100
  • 【开源打印组件】vue-plugin-hiprint初体验

    vue-plugin-hiprint的学习与应用 😄 生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享学…

    Linux 2023年6月6日
    0173
  • Linux IP 命令略解

    help 为该命令的帮助信息。 实例ip link show # 显示网络接口信息 ip link set eth0 up # 开启网卡 ip link set eth0 down…

    Linux 2023年6月14日
    085
  • Cisco 7200 路由 PPPOE 拨号详解

    R1(config)#vpdn enable #启用vpdn虚拟专用拨号网络 R1(config)#interface dialer 1 #定义拨号器1 R1(config-if)…

    Linux 2023年6月6日
    093
  • 015 Linux 标准输入输出、重定向、管道和后台启动进程命令

    1 三种标准输入输出 2 什么是重定向?如何重定向? (1)什么是重定向? (2)如何重定向? 3 管道符以及和它容易混淆的一些符号使用 (1)管道符 | (2)&和&am…

    Linux 2023年5月27日
    0116
  • DNS 查询原理详解

    你可能会问,难道 DNS 服务器(比如 1.1.1.1)保存了世界上所有域名(包括二级域名、三级域名)的 IP 地址? 当然不是。DNS 是一个分布式系统,1.1.1.1 只是用户…

    Linux 2023年6月8日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球