【PyQt5-Qt Designer】鼠标+键盘事件

重定义鼠标响应+键盘响应事件

一,每个事件都被封装成相应的类:

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

posted @ 2018-12-26 18:14  XJT2019  阅读(4910)  评论(0编辑  收藏  举报