重定义鼠标响应+键盘响应事件
一,每个事件都被封装成相应的类:
pyqt中,每个事件类型都被封装成相应的事件类,如鼠标事件为QMouseEvent,键盘事件为QKeyEvent等。而它们的基类是QEvent。
二,基类QEvent的几个重要方法:
accept() 表示事件已处理,不需要向父窗口传播
ignore()表示事件未处理,继续向父窗口传播f
type()返回事件类型,如QtCore.QEvent.MouseButtonPress,一般由基事件调用。因为其它事件已经知道自己的事件类型了。
还有一个自定义事件的注册方法。
三,QMouseEvent鼠标事件:
buttons() 返回哪个鼠标按键被按住了。如Qt.LeftButton
globalPos() 返回鼠标相对屏幕的位置QPoint
pos() 返回鼠标相对处理事件的窗口的位置
四、处理鼠标事件的响应函数(在QWidget及其继承类中):
mousePressEvent(QMouseEvent) #鼠标点击触发事件
mouseReleaseEvent(event) #鼠标释放触发事件
mouseMoveEvent(event) #鼠标移动触发事件
# 事件。 """重写鼠标事件,实现窗口拖动。""" def mousePressEvent(self, event): if event.buttons() == Qt.LeftButton: self.setCursor(Qt.OpenHandCursor) self.parent.m_drag = True self.parent.m_DragPosition = event.globalPos()-self.parent.pos() event.accept() def mouseMoveEvent(self, event): try: if event.buttons() and Qt.LeftButton: self.parent.move(event.globalPos()-self.parent.m_DragPosition)#move将窗口移动到指定位置 event.accept() except AttributeError: pass def mouseReleaseEvent(self, event): if event.button()==Qt.LeftButton: self.m_drag = False self.unsetCursor()
效果如下:
重新定义鼠标事件:
"""重定义鼠标单击事件""" def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.lab1.setText("鼠标左键点击!") # print(event.pos().x(),event.pos().y()) if event.button() == Qt.RightButton: self.lab1.setText("鼠标右键点击!") """当鼠标左键点击拖动时触发事件,有无if判断条件效果都一样""" def mouseMoveEvent(self, event): # if event.buttons() == Qt.LeftButton: # # print(type(event.pos().x())) #<class 'int'> # self.lab2.setText(str(event.pos().x())+","+str(event.pos().y())) self.pos = event.pos() print(self.pos) self.lab2.setText(str(event.pos().x()) + "," + str(event.pos().y())) self.update()
完整代码:
1 from PyQt5.QtCore import Qt 2 from PyQt5.QtGui import (QPainter, QColor, QPen) 3 import sys 4 from PyQt5.QtWidgets import (QApplication,QWidget,QLabel) 5 6 class Example(QWidget): 7 def __init__(self): 8 super(Example, self).__init__() 9 self.initUi() 10 #默认情况下禁用鼠标跟踪, 如果启用鼠标跟踪,即使没有按钮被按下,小部件也会接收鼠标移动事件。 11 #当然你也可以不写,只需要在执行的过程中按照鼠标左键也行 12 self.setMouseTracking(True) 13 14 def initUi(self): 15 self.setGeometry(400,300,400,300) 16 self.setWindowTitle("键盘响应事件") 17 self.lab1 = QLabel("方向",self) 18 self.lab1.setGeometry(200,150,100,100) 19 self.lab2 = QLabel("显示鼠标坐标", self) 20 self.lab2.setGeometry(200, 80, 100, 100) 21 22 """重定义键盘事件""" 23 def keyPressEvent(self,e ): 24 if e.key() == Qt.Key_Up: 25 self.lab1.setText("↑") 26 elif e.key() == Qt.Key_Down: 27 self.lab1.setText("↓") 28 elif e.key() == Qt.Key_Left: 29 self.lab1.setText("←") 30 else: 31 self.lab1.setText("→") 32 33 """重定义鼠标单击事件""" 34 def mousePressEvent(self, event): 35 if event.button() == Qt.LeftButton: 36 self.lab1.setText("鼠标左键点击!") 37 # print(event.pos().x(),event.pos().y()) 38 if event.button() == Qt.RightButton: 39 self.lab1.setText("鼠标右键点击!") 40 41 """当鼠标左键点击拖动时触发事件,有无if判断条件效果都一样""" 42 def mouseMoveEvent(self, event): 43 # if event.buttons() == Qt.LeftButton: 44 # # print(type(event.pos().x())) #<class 'int'> 45 # self.lab2.setText(str(event.pos().x())+","+str(event.pos().y())) 46 self.pos = event.pos() 47 print(self.pos) 48 self.lab2.setText(str(event.pos().x()) + "," + str(event.pos().y())) 49 self.update() 50 51 52 53 if __name__ == '__main__': 54 app = QApplication(sys.argv) 55 ex = Example() 56 ex.show() 57 sys.exit(app.exec_())
所有的QT键盘事件代码如下:
https://pan.baidu.com/s/1Brry6fkUcxaP-uOdukD8Ng