PyQt信号与槽之事件处理机制(八)

您所在的位置:网站首页 摄像头侧面 PyQt信号与槽之事件处理机制(八)

PyQt信号与槽之事件处理机制(八)

2024-07-07 15:09:27| 来源: 网络整理| 查看: 265

前言

信号与槽可以说是对事件处理机制的高级封装,如果说事件是用来创建窗口控件的,那么信号与槽就是用来对这个控件进行使用的,比如一个按钮,当我们使用按钮时,只关心clicked信号,至于这个按钮如何接受并处里鼠标点击事件,然后在发射这个信号,则不关心,但是如果要重载一个按钮,这时候就要关心了,比如可以改变它的行为:在鼠标按下时触发clicked信号,而不是释放时

常见事件类型

pyqt是对Qt的封装,qt程序是事件驱动的,它的每个动作都有幕后某个事件所触发,Qt事件类型有很多,常见的如下

键盘事件:按键的按下与松开鼠标事件:鼠标指针的移动,鼠标按键的按下与松开拖放事件:用鼠标进行拖放滚轮事件:鼠标滚轮滚动绘屏事件:重绘制屏幕的某些部分定时事件:定时器到时焦点事件:键盘焦点移动进入和离开事件:鼠标指针移入Widget内,或者移出移动事件:Widget的位置改变大小改变事件:widget的大小改变显示和隐藏事件:widget显示与隐藏窗口事件:窗口是否为当前窗口

还有一些常见的qt事件,比如Socket事件,剪切板事件,字体改变事件,布局改变事件

使用事件处理的方法

pyqt提供如下5中事件处理和过滤的方法(有弱到强),其中只有前两种方法使用最频繁

1 重新实现事件函数

比如mousePressEvent(),keyPressEvent(),paintEvent(),这是最常规的事件处理方法

2 重新实现QObject.event()

一般用在pyqt没有提供该事件的处理函数的情况下,即增加新事件时

3 安装事件过滤器

如果对QObject调用installEventFilter,则相当于为这个QObject安装了一个事件过滤器,对于QObject的全部事件来说,它们都会先传递到事件过滤函数eventFilter中,在这个函数中,我们可以抛弃或者修改这些事件,比如对自己感兴趣的事件使用自定义的处理机制,对其他事件采用默认的事件处理机制,由于这中方法会调用installEventFilter的所有QObject的事件进行过滤,因此如果要过滤的事件比较多,则会降低程序的性能

4 在QApplication中安装事件过滤器

这种方法比上一种更强大,QApplication的事件过滤器将捕获所有的QObject事件,而且第一个获得该事件,也就是说,在将事件发送给其他任何一个事件过滤器之前,都会发送给QApplication的事件过滤器

5 重新实现QApplication的notify()方法

pyqt使用notify来分发事件,要想在任何事件处理器之前捕获事件,唯一的方法就是重新实现QApplication的notify(),在实践中,在调试才会用这中方法

实例:经典案例 import sys from PyQt5.QtCore import (QEvent, QTimer, Qt) from PyQt5.QtWidgets import (QApplication, QMenu, QWidget) from PyQt5.QtGui import QPainter class Widget(QWidget): def __init__(self, parent=None): super(Widget, self).__init__(parent) #初始化数据 #鼠标双击False self.justDoubleClicked = False #按键,输出文本,提示消息为空 self.key = "" self.text = "" self.message = "" #设置窗口初始大小与位置 self.resize(400, 300) self.move(100, 100) #设置标题 self.setWindowTitle("Events") #定时器1秒后执行槽函数 QTimer.singleShot(1000, self.giveHelp) # 避免窗口大小重绘事件的影响,可以把参数0改变成3000(3秒),然后在运行,就可以明白这行代码的意思。 def giveHelp(self): self.text = "请点击这里触发追踪鼠标功能" # 重绘事件,也就是触发paintEvent函数。 self.update() '''重新实现关闭事件''' def closeEvent(self, event): print("Closed") '''重新实现上下文菜单事件''' def contextMenuEvent(self, event): #实例化菜单,添加子菜单one two并附加快捷键功能,关联槽函数 menu = QMenu(self) oneAction = menu.addAction("&One") twoAction = menu.addAction("&Two") oneAction.triggered.connect(self.one) twoAction.triggered.connect(self.two) #如果message为空,执行 if not self.message: #在菜单中添加一条分割线 menu.addSeparator() #添加自菜单three,关联槽函数 threeAction = menu.addAction("Thre&e") threeAction.triggered.connect(self.three) #菜单栏出现在鼠标的位置 menu.exec_(event.globalPos()) '''上下文菜单槽函数''' def one(self): self.message = "Menu option One" self.update() def two(self): self.message = "Menu option Two" self.update() def three(self): self.message = "Menu option Three" self.update() '''重新实现绘制事件''' def paintEvent(self, event): text = self.text i = text.find("\n\n") if i >= 0: text = text[0:i] # 若触发了键盘按钮,则在文本信息中记录这个按钮信息。 if self.key: text += "\n\n你按下了: {0}".format(self.key) painter = QPainter(self) painter.setRenderHint(QPainter.TextAntialiasing) # 绘制信息文本的内容 painter.drawText(self.rect(), Qt.AlignCenter, text) # 若消息文本存在则在底部居中绘制消息,5秒钟后清空消息文本并重绘。 if self.message: #显示给定坐标处的文本,坐标,对齐方式。文本内容 painter.drawText(self.rect(), Qt.AlignBottom | Qt.AlignHCenter, self.message) #5秒钟后触发清空信息的函数,并重新绘制事件 QTimer.singleShot(5000, self.clearMessage) QTimer.singleShot(5000, self.update) '''清空消息文本的槽函数''' def clearMessage(self): self.message = "" '''重新实现调整窗口大小事件''' def resizeEvent(self, event): self.text = "调整窗口大小为: QSize({0}, {1})".format( event.size().width(), event.size().height()) self.update() '''重新实现鼠标释放事件''' def mouseReleaseEvent(self, event): # 若鼠标释放为双击释放,则不跟踪鼠标移动 if self.justDoubleClicked: self.justDoubleClicked = False # 若鼠标释放为单击释放,则需要改变跟踪功能的状态,如果开启跟踪功能的话就跟踪,不开启跟踪功能就不跟踪 else: # 单击鼠标 self.setMouseTracking(not self.hasMouseTracking()) if self.hasMouseTracking(): self.text = "开启鼠标跟踪功能.\n" + \ "请移动一下鼠标!\n" + \ "单击鼠标可以关闭这个功能" else: self.text = "关闭鼠标跟踪功能.\n" + \ "单击鼠标可以开启这个功能" self.update() '''重新实现鼠标移动事件''' def mouseMoveEvent(self, event): #如果没有鼠标双击,执行 if not self.justDoubleClicked: # 窗口坐标转换为屏幕坐标 globalPos = self.mapToGlobal(event.pos()) self.text = """鼠标位置: 窗口坐标为:QPoint({0}, {1}) 屏幕坐标为:QPoint({2}, {3}) """.format(event.pos().x(), event.pos().y(), globalPos.x(), globalPos.y()) self.update() '''重新实现鼠标双击事件''' def mouseDoubleClickEvent(self, event): self.justDoubleClicked = True self.text = "你双击了鼠标" self.update() '''重新实现键盘按下事件''' def keyPressEvent(self, event): self.key = "" if event.key() == Qt.Key_Home: self.key = "Home" elif event.key() == Qt.Key_End: self.key = "End" elif event.key() == Qt.Key_PageUp: if event.modifiers() & Qt.ControlModifier: self.key = "Ctrl+PageUp" else: self.key = "PageUp" elif event.key() == Qt.Key_PageDown: if event.modifiers() & Qt.ControlModifier: self.key = "Ctrl+PageDown" else: self.key = "PageDown" elif Qt.Key_A


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭