今天实现一个鼠标点击事件,效果如下图所示。

入门 PyQt6 看过来(基础)04 ~ 鼠标事件_qt

要实现这个功能,前提要先熟悉以下什么是事件。

1 事件

在PyQt6的GUI编程中,基于QWidget的应用程序都是由事件event驱动的,它的每个动作都会触发事件。例如单击命令按钮,系统就会产生一个鼠标点击事件,在文本框中输入内容就会产生鼠标事件,最小化窗口等会产生相应的事件等。

1.1 系统事件类型

事件

描述

键盘事件

按键按下松开、焦点移动、获取焦点和失去焦点等触发的事件

鼠标事件

鼠标按下松开、移动点击双击、进入离开等都会触发的事件

窗口事件

Widget的位置改变、大小改变、显示隐藏关闭等事件

绘制屏幕图形

窗口绘制和重绘动作

定时事件

定时器到时间触发事件

此外还有Socket事件、剪切板事件、字体改变事件、布局改变事件等(很多)

1.2 默认事件处理函数

PyQt6中,事件是一种对象,事件的基类是抽象类QEvent。QEvent有众多子类表示具体的事件,例如QKeyEvent表示键盘事件,QMouseEvent表示鼠标事件。

QEvent类定义了下列接口函数:

  • accept():接收此事件,被接收的事件不会再继续上传至上层容器控件。
  • ignore():忽略此事件,被忽略的事件会继续上传至上层容器控件。
  • type():返回事件的类型。事件类型是枚举,例如QMouseEvent的type枚举值为5。

2.案例实现

2.1 创建event事件文件

创建event事件文件并命名为“事件处理.py”,编写如下代码:

# 自定义一个标签类
class myLabel(QtWidgets.QLabel):
    def __init__(self, parent=None):
        super(myLabel,self).__init__(parent)
        font = QFont("楷体",16)
        self.setFont(font)
    # 重载鼠标按下事件
    def mousePressEvent(self, event):
        if event.buttons() == Qt.MouseButton.LeftButton:
            self.setText("单机鼠标左键")
        elif event.buttons() == Qt.MouseButton.RightButton:
            self.setText("单击鼠标右键")
        elif event.buttons() == Qt.MouseButton.MiddleButton:
            self.setText("单机鼠标中键")
        elif event.buttons() ==Qt.MouseButton.LeftButton|Qt.MouseButton.RightButton:
            self.setText("同时单击鼠标左右键")
    # 重载鼠标滚轮事件
    def wheelEvent(self, event):
        angle = event.angleDelta() / 8
        angleX = angle.x()
        angleY = angleX.y()
        if angleY > 0:
            self.setText("滚轮向上滚动")
            print("鼠标滚轮上滚",angleY)
        else:
            self.setText("滚轮向下滚动")
            print("鼠标滚轮下滚", angleX)
    # 鼠标双击事件
    def mouseDoubleClickEvent(self, event):
        print("鼠标双击")
    # 释放鼠标事件
    def mouseReleaseEvent(self,event):
        self.setText("鼠标按键释放")

上述代码中包含鼠标的按下、滚动、双击以及释放鼠标的事件,这些事件已经包含在myLabel类里面了,只要我们创建myLabel类,这些方法就可以使用。

2.2 创建面板并实现鼠标事件

# 自定义主窗口
class myWidget(QtWidgets.QWidget):
    def __init__(self):
        super(myWidget, self).__init__()
        self.setWindowTitle("事件测试")
        self.resize(350,250)
        self.lb = myLabel(self)
        self.lb.setText("----请点击-------")
        self.lb.setGeometry(60,40,220,50)
    def mouseMoveEvent(self, event):
        print("鼠标移动", self.x(), self.y())
    def resizeEvent(self,event):
        message = "窗口大小调整为:QSize({0},{1})".format(event.size().width(),event.size().height())
        print(message)
    def keyPressEvent(self, event):
        print("key")
        if event.key() == Qt.Key.Key_Escape:
            self.close()
    def event(self,event):
        if(event.type()== QEvent.Type.KeyPress and event.key() == Qt.Key.Key_Q):
            print("A Key")
            self.close()
            return True
        return QWidget.event(self, event)

代码中的 self.lb = myLabel(self)

2.3 创建main方法,实现可视化

if __name__ =="__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = myWidget()
    w.show()
    sys.exit(app.exec())


入门 PyQt6 看过来(基础)04 ~ 鼠标事件_pyqt6_02

接下来就可以尝试点击鼠标,查看效果了,注意看输出的日志

 下一篇:PyQt6 对话框