PyQt5每天必学之事件与信号


Posted in Python onApril 20, 2018

这一部分我们将探索 PyQt5 的事件和信号是如何在应用程序中实现的。

Events事件

所有的GUI应用程序都是事件驱动的。应用程序事件主要产生自用户,但它们也可通过其他方法来产生,例如一个互联网连接,一个窗口管理器,或计时器。当我们调用应用程序的exec_()方法,应用程序进入主循环。主循环检测各种事件,并把它们发送到事件对象。

在事件模型中,有三个参与者:

  • event source(事件源)
  • event object(事件对象)
  • event target(事件目标)

事件源是对象的状态改变而产生事件。事件对象(事件)是封装在事件源中状态变化的对象。事件目标是希望被通知的对象。事件源对象代表处理一个事件到事件目标的任务。

PyQt5使用独特的信号和槽机制来处理事件。信号和槽用于对象之间的通信,当一个特定的事件发生时,信号被发射。槽可以是任意的Python调用。信号发射时连接到槽被调用。

Signals & slots信号和槽

这是一个简单的例子演示PyQt5的信号和槽。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

这个例子中,我们将QSlider的滑动信号连接到QLCDNumber中。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月1日
"""

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QSlider, 
QLCDNumber, QVBoxLayout)
from PyQt5.QtCore import Qt

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('信号/槽') 
 self.show()

if __name__ == '__main__':

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

在我们的例子中,将用到QtGui.QLCDNumber和QtGui.QSlider。我们通过拖动滑块改变LCD数字。

sld.valueChanged.connect(lcd.display)

在这里,滑块的 valueChanged 信号连接到 lcd 的显示(display)槽。

发送器是对象发送信号。接收器是接收信号的对象。槽的是反馈给信号的方法。

程序执行后

PyQt5每天必学之事件与信号

覆写系统事件处理程序

事件在PyQt5中的处理往往通过重写事件来处理程序。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们执行事件处理程序。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月1日
"""

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

class Example(QWidget):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 self.setGeometry(300, 300, 250, 150)
 self.setWindowTitle('事件处理') 
 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() 事件处理程序。

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

如果我们按下键盘上的 Esc 键,应用程序终止。

Event sender事件发送

为了方便区分多个连接到同一事件目标的事件源,在PyQt5中可以使用sender()方法。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们确定事件发送对象。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月1日
"""

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

class Example(QMainWindow):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 btn1 = QPushButton('按钮一', self)
 btn1.move(30, 50)

 btn2 = QPushButton('按钮二', self)
 btn2.move(150, 50)

 btn1.clicked.connect(self.buttonClicked)
 btn2.clicked.connect(self.buttonClicked)

 self.statusBar()

 self.setGeometry(300, 300, 300, 150)
 self.setWindowTitle('事件发送') 
 self.show()

 def buttonClicked(self):

 sender = self.sender()
 self.statusBar().showMessage(sender.text() + ' 被按下')

if __name__ == '__main__':

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

在我们的例子中有两个按钮。两个按钮都连接 buttonClicked() 方法,我们通过调用 sender() 方法响应单击的按钮。

btn1.clicked.connect(self.buttonClicked)
btn2.clicked.connect(self.buttonClicked)

两个按钮连接到同一个槽。

def buttonClicked(self):

 sender = self.sender()
 self.statusBar().showMessage(sender.text() + ' 被按下')

我们通过调用 sender() 方法确定信号源。在应用程序的状态栏,显示被按下按钮的标签。

程序执行后

PyQt5每天必学之事件与信号

定制发射信号

从一个QObject 创建的对象可以发出信号。在下面的例子中,我们将看看我们如何能够定制发出信号。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们显示了如何以发射信号。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月1日
"""

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import pyqtSignal, QObject

class Communicate(QObject):
 closeApp = pyqtSignal()

class Example(QMainWindow):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 self.c = Communicate()
 self.c.closeApp.connect(self.close)

 self.setGeometry(300, 300, 300, 150)
 self.setWindowTitle('发射信号') 
 self.show()

 def mousePressEvent(self, event):

 self.c.closeApp.emit()

if __name__ == '__main__':

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

我们创建一个名为closeApp新的信号。这个信号是发射按下鼠标事件。该信号被连接到QMainWindow中的close()槽。

class Communicate(QObject):
 closeApp = pyqtSignal()

创建继承自 QObject 的 Communicate 类,该类中有一个 pyqtSignal() 类的属性。

self.c = Communicate()
self.c.closeApp.connect(self.close)

将我们自定义的 closeApp 信号连接到QMainWindow中的close()槽。

def mousePressEvent(self, event):
 self.c.closeApp.emit()

当我们鼠标在程序窗口出现点击动作时,closeApp信号被发射(emit)。应用程序终止。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用新浪微博API发送微博的例子
Apr 10 Python
基于wxpython实现的windows GUI程序实例
May 30 Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 Python
tensorflow获取变量维度信息
Mar 10 Python
Django中信号signals的简单使用方法
Jul 04 Python
pow在python中的含义及用法
Jul 11 Python
Python数组并集交集补集代码实例
Feb 18 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
Python之Sklearn使用入门教程
Feb 19 Python
Django Paginator分页器的使用示例
Jun 23 Python
Python 语言实现六大查找算法
Jun 30 Python
如何在python中实现ECDSA你知道吗
Nov 23 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 #Python
基于pandas数据样本行列选取的方法
Apr 20 #Python
pandas实现选取特定索引的行
Apr 20 #Python
PyQT实现多窗口切换
Apr 20 #Python
使用实现pandas读取csv文件指定的前几行
Apr 20 #Python
浅析python打包工具distutils、setuptools
Apr 20 #Python
PyQt5每天必学之切换按钮
Aug 20 #Python
You might like
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
pdo中使用参数化查询sql
2011/08/11 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
php array_map()函数实例用法
2021/03/03 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
angularJs的ng-class切换class
2017/06/23 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
Vue3.x源码调试的实现方法
2019/10/13 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
Python docx库用法示例分析
2019/02/16 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
如何利用python创作字符画
2022/06/25 Python
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript