赞
踩
参考:
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()表示事件未处理,继续向父窗口传播f
type()返回事件类型,如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()方法时,点击标签控件,消息的传递途径
事件传递的思想主要在于,父控件也想知道子控件发生了什么事件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。