参考:
1.pyqt5事件与鼠标事件
2.PyQt5 鼠标点击事件(点击响应事件可自定义):鼠标单击、双击、滚轮滚动、释放、移动等
3.使用pyqt5实现键盘(含组合键)鼠标事件响应
4.pythonGUI图形编程开发项目实战-24

pyqt实现人机交互的方式:事件机制

一个应用程序会不断的检擦消息队列,如果发现消息,则会包装成QEvent对象进行分发。该event首先会传递给QApplication的notify(receiver,evt)方法,并通过该方法将事件消息转发给reciver具体的事件函数:如将键盘事件分发给KeyPressEvent()


一、监听事件
在pyqt中,每个事件类型都被封装成相应的事件类,如鼠标事件为QMouseEvent,键盘事件为QKeyEvent等。而它们的基类是QEvent。**键盘、鼠标等每一次与窗口的交互(即事件)都应该被监听。不同的事件消息都能通过相应的方法监听。**下面将列举一些常见的事件消息和其对应的监听方法
基类Qevent的几个重要方法:

accept() 表示事件已处理,不需要向父窗口传播ignore()表示事件未处理,继续向父窗口传播ftype()返回事件类型,如QtCore.QEvent.MouseButtonPress,一般由基事件调用。因为其它事件已经知道自己的事件类型了。还有一个自定义事件的注册方法。


pyqt为事件机制内置了很多方法。如监听用户打开和关闭窗口的showEvent(QShowEvent)和closeEvent(QCloseEvent)两个方法。而我们只需要对这些方法进行重载就能为这些方法增进新功能了。示例 :窗口在显示和关闭时都会打印相应字符串

除此之外,每一个处理事件的函数的参数都是其所对应的事件对象。如showEvent()中的参数为QShowEvent,这些特定的事件对象包含了特定事件的信息。

二、移动事件
移动事件通过moveEvent(QMoveEvent)方法监听,该方法接受事件对象QMoveEvent

三、调整大小
调整控件大小通过resizeEvent(QResizeEvent)方法监听

四、鼠标事件

鼠标进出该窗口的事件由enterEvent(QEvent)和leaveEvent(QEvent)方法监听

处理鼠标事件的响应函数(再QWidget及其继承类中):

mousePressEvent(QMouseEvent)
mouseReleaseEvent(event)
mouseMoveEvent(event)

QApplicaption类的setDoubleClickInterval( )方法可设置双击的时间间隔;doubleClickInterval( )方法返回双击的时间间隔。
event参数是QMouseEvent对象,存储事件的其他信息。有以下方法:

(这里有两个方法的参数是event是为了说明event是一切事件的父类的实例化对象)

    x() 和 y() -返回相对于控件空间的鼠标坐标值;pos() - 返回相对于控件空间的QPoint对象;localPos()- 返回相对于控件空间的QPointF对象;globalX() 和 globalY() -  返回相对于屏幕的x,y 坐标值;globalPos() - 返回相对于屏幕的QPoint对象;windowPos() -  返回相对于窗口的QPointF对象; screenPos() - 返回相对于屏幕的QPointF对象; button() - 返回以下枚举值(只列了部分,详细内容参见http://doc.qt.io/qt-5/qt.html#MouseButton-enum),用以判断是哪个鼠标健触发了事件。QtCore.Qt.NoButton - 0 - 没有按下鼠标键。例如移动鼠标时的button()返回值;QtCore.Qt.LeftButton -1 -按下鼠标左键;QtCore.Qt.RightButton -2 -按下鼠标右键;QtCore.Qt.Mion 或 QtCore.Qt.MiddleButton -4 -按下鼠标中键;buttons() - 返回前面所列枚举值的组合,用于判断同时按下了哪些键。modifiers() - 判断按下了哪些修饰键(Shift,Ctrl , Alt,等等),详见键盘事件(18)中的modifiers()。timestamp() - 返回事件发生的时间;


五、键盘事件

keyPressEvent(self, event)方法监控键盘事件。通过重载该方法可以对增加对键盘的相应:

 # 检测键盘回车按键,函数名字不要改,这是重写键盘事件def keyPressEvent(self, event):#这里event.key()显示的是按键的编码print("按下:" + str(event.key()))# 举例,这里Qt.Key_A注意虽然字母大写,但按键事件对大小写不敏感if (event.key() == Qt.Key_Escape):print('测试:ESC')if (event.key() == Qt.Key_A):print('测试:A')if (event.key() == Qt.Key_1):print('测试:1')if (event.key() == Qt.Key_Enter):print('测试:Enter')if (event.key() == Qt.Key_Space):print('测试:Space')# 当需要组合键时,要很多种方式,这里举例为“shift+单个按键”,也可以采用shortcut、或者pressSequence的方法。if (event.key() == Qt.Key_P):if QApplication.keyboardModifiers() == Qt.ShiftModifier:print("shift + p")else :print("p")if (event.key() == Qt.Key_O) and QApplication.keyboardModifiers() == Qt.ShiftModifier:print("shift + o")

六、焦点事件
当键盘输入时,我们需要让计算机知道这个输入传递给哪个控件。该功能通过焦点事件实现,假如窗口中有两个单行文本编辑控件,当光标落在哪个控件,焦点就在哪个控件。

七、拖拽事件
示例:当用户从窗口外拖拽一个文件进入该窗口时就会触发所谓的拖拽事件

八、绘制事件
绘制事件和绘图无关。之所以我们能够看到窗口内容的不断变化,实际上是在程序运行时的每次循环中都会触发该事件,从而更新控件的显示。(可以理解为我们的窗口是被画出来的)

九、改变事件

十、右键菜单

如该浏览器所示,我们在窗口中右击时会出现右击菜单

十一、输入法

小结:
当一个控件被触发了特定行为时,就会调用特定的方法来将该方法传递给开发人员。
重写这些事件方法,就可以监听相关信息。

十二、事件的转发(父子对象 )

事件的转发:当子控件中有事件消息时,会优先在子控件中实现处理该消息的方法,如果没有则会传递至其父控件处理,如果还没处理则会在传递,直到被处理或不可再被传递。

视频教程设计了子控件label,中间控件(黄色部分)和父控件(窗口)。并且为每个控件都重写了mousePressEvent()方法,当鼠标在不同位置点击时会触发相应的控件内的事件方法。
例如此时将标签控件中重写的mousePressEvent()方法注释掉,即标签没有处理该事件的方法:鼠标点击标签,打印“中间控件被按下”

之后作者在中间控件中加入了按钮,并且没有给按钮控件定义任何的方法。点击按钮时不打印任何语句,点击标记会打印“中间控件被按下”,这表明按钮内置了处理鼠标点击事件的方法。
上面提到QEvent的几个重要方法:

accept() 表示事件已处理,不需要向父窗口传播
ignore()表示事件未处理,继续向父窗口传播f
isAccepted()返回事件是否处于已被处理的状态
type()返回事件类型,如QtCore.QEvent.MouseButtonPress,一般由基事件调用。因为其它事件已经知道自己的事件类型了。
还有一个自定义事件的注册方法。

示例展示了有无执行ignore()方法时,点击标签控件,消息的传递途径


事件传递的思想主要在于,父控件也想知道子控件发生了什么事件。

pyqt5-事件机制相关推荐

  1. 「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

    前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化 ES6 中箭头函数的用法 this 的原理以及用法 伪类与伪元素的区别及实战 如何实现一个圣杯布局? ...

  2. jQuery中的事件机制深入浅出

    昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...

  3. 【初窥javascript奥秘之事件机制】论“点透”与“鬼点击”

    前言 最近好好的研究了一番移动设备的点击响应速度,期间不断的被自己坑,最后搞得焦头烂额,就是现在可能还有一些问题,但是过程中感觉自己成长不少, 最后居然感觉对javascript事件机制有了更好的认识 ...

  4. 【探讨】javascript事件机制底层实现原理

    前言 又到了扯淡时间了,我最近在思考javascript事件机制底层的实现,但是暂时没有勇气去看chrome源码,所以今天我来猜测一把 我们今天来猜一猜,探讨探讨,javascript底层事件机制是如 ...

  5. React事件机制 - 源码概览(下)

    上篇文档 React事件机制 - 源码概览(上)说到了事件执行阶段的构造合成事件部分,本文接着继续往下分析 批处理合成事件 入口是 runEventsInBatch // runEventsInBat ...

  6. 11.QT事件机制源码时序分析(下)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109182406,本文继续解析QCoreApplication::sendEvent和Q ...

  7. 10.QT事件机制源码时序分析(中)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109162220,上篇文章已经说过,在Ubuntu18.04,QT的事件机制实际上是采用 ...

  8. 9.QT事件机制源码时序分析(上)

    通过上两篇博客https://blog.csdn.net/Master_Cui/article/details/109093845和https://blog.csdn.net/Master_Cui/a ...

  9. Spring 与 Spring Boot 中的事件机制

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 温安适 来源 | https://my.osc ...

  10. onresize事件会被多次触发_玩转SpringBoot之通过事件机制参与SpringBoot应用的启动过程...

    生命周期和事件监听 一个应用的启动过程和关闭过程是归属到"生命周期"这个概念的范畴. 典型的设计是在启动和关闭过程中会触发一系列的"事件",我们只要监听这些事件 ...

最新文章

  1. java httpclient 获取cookie_java – 从httpclient 3转换为httpclient 4(Cookie策略)
  2. 图解HTTP学习记录(六)
  3. C++ 合并文件夹下所有的txt文件
  4. 传输层的TCP和UDP
  5. Jmeter HTTP请求后响应数据显示乱码解决方法
  6. 将G1内的SIM卡联系人导入到GMAIL的联系人中
  7. ota编译及差分包制作
  8. visual svn 搭建
  9. AtCoder Grand Contest 010 D - Decrementing
  10. java数组名加括号_数组作参数被使用时,数组名后必须加方括号
  11. Ubuntu20安装卸载MySQL8.0
  12. LPC1788 UART-DMA遇到的问题
  13. oracle 的insert into的详解
  14. 【C语言】写一个程序,输出一个在100到200之间的数字,这个单位的数字是6,可以除以3。
  15. html css 忽略,HTML与CSS中易被忽略的基础知识点
  16. 快递电子运单上,电话应隐藏6位以上,禁止显示这些信息
  17. C#发送企业内部邮件
  18. Android ANR问题总结
  19. 浙江大学计算机学院沈吕可晟,敬廉崇洁,知诚讲信 ——求是学院廉洁诚信文化作品征集活动等你来参加!...
  20. 衣米魔兽世界怀旧服—战歌峡谷PVP视频

热门文章

  1. 丧心病狂的Monkey测试
  2. SmartBI入门(一)介绍和安装
  3. 【清单】边角知识清单
  4. Android - 城市/单项/国家区号选择器基础使用 及 使用国际区号json文件
  5. 小程序心知天气API获取数据
  6. mysql中获取时间的年月日_Mysql获取系统时间,年,月,日
  7. cmake依赖ffmpeg库(x264)错误
  8. C#从图中截取部分图片 代码实现截图
  9. 吴恩达:机器学习的六个核心算法
  10. docker exec命令-进入docker中