QT 事件系统之QMouseEvent鼠标事件

概述

在Qt中,鼠标事件被封装成.QMouseEvent对象,QMouseEvent中包含一些参数,用描述鼠标事件。

在QT中,鼠标事件包含:鼠标按键按下,鼠标按键释放,鼠标双击事件,鼠标移动事件。
分别由下面的event handle(事件处理器,实际上就是一些可override的函数)r来处理:

virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);

这些函数是QWidget的virtual函数,在Qt中称为event handler.如果你想在QWidget中自定义行为以响应相关事件,请override这些函数。

详细描述

当在Widgets内部 按下 或 释放 鼠标按键,移动鼠标光标,或者双击鼠标时,会产生鼠标事件。

除非使用QWidget :: setMouseTracking()启用鼠标跟踪,否则只有在按下鼠标按钮时才会发生鼠标移动事件。

当在窗口小部件中按下鼠标按钮时,Qt会自动抓取鼠标; 小部件将继续接收鼠标事件,直到释放最后一个鼠标按钮。

鼠标事件包含一个特殊的接受标志,指示接收者是否想要该事件。如果窗口小部件未处理鼠标事件,则应调用ignore()。鼠标事件沿父窗口小部件链向上传播,直到窗口小部件使用accept()接受它,或者事件过滤器消耗它。

鼠标事件属于冒泡事件,鼠标事件会一直随着其父链一直路由下去,知道有widget接受它,或者有事件过滤器消耗它。

注意:如果鼠标事件被路由到包含Qt:: WA_NoMousePropagation窗口属性的窗口小部件,该鼠标事件不会进一步沿着父控件链路由。

修饰键(Modifier)的状态可以通过QInputEvent::modifiers()函数找到。

函数pos(),x()和y()给出了鼠标光标在接收鼠标事件的窗口小部件中的位置,这是局部坐标位置。如果要使用鼠标事件(通常是鼠标光标移动事件)来移动窗口小部件,请使用globalPos()返回的全局位置以避免抖动。

如果你想在QWidget接收到的鼠标事件中添加自定义行为,请重新实现QWidget的 event handler:

virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);

属性

protected:
    QPointF l, w, s;
    Qt::MouseButton b;
    Qt::MouseButtons mouseState;
    int caps;
    QVector2D velocity;
  • l – 全写local
    表示的是当鼠标事件发生时,鼠标光标在接收该鼠标事件的窗口小部件中位置,局部坐标。可以通过LocalPos(),x(),y()方法获取。

  • w – 全写window
    表示的是当鼠标事件发生时,鼠标光标在接收该鼠标事件的窗口中位置(父亲widget?还是最顶层widget?)。可以通过windowPos()。

  • s – Screen
    表示的是当鼠标事件发生时,鼠标光标在屏幕坐标系统中的位置。可以通过globalPos()方法获取。

  • b – button
    产生鼠标事件的鼠标按键:鼠标左键,鼠标右键等

  • mouseState
    鼠标事件发生时按钮状态。按钮状态是使用OR运算符的Qt :: LeftButton,Qt :: RightButton,Qt :: MidButton的组合。对于鼠标移动事件,这是按下的所有按钮。对于鼠标按下和双击事件,这包括导致事件的按钮。对于鼠标释放事件,这将排除导致事件的按钮。

相关枚举类型

MouseButton

鼠标按键类型:鼠标左键,右键,中键等

enum MouseButton {
        NoButton         = 0x00000000,
        LeftButton       = 0x00000001,
        RightButton      = 0x00000002,
        MidButton        = 0x00000004, // ### Qt 6: remove me
        MiddleButton     = MidButton,
        BackButton       = 0x00000008,
        XButton1         = BackButton,
        ExtraButton1     = XButton1,
        ForwardButton    = 0x00000010,
        XButton2         = ForwardButton,
        ExtraButton2     = ForwardButton,
        TaskButton       = 0x00000020,
        ExtraButton3     = TaskButton,
        ...

MouseEventSource

描述鼠标事件的来源,常用于判断鼠标事件是否是来自于其他设备(比如触摸屏)的人造鼠标事件。比如将触摸事件模拟成鼠标事件

enum MouseEventSource {
        MouseEventNotSynthesized,
        MouseEventSynthesizedBySystem,
        MouseEventSynthesizedByQt,
        MouseEventSynthesizedByApplication
    };

MouseEventFlag

enum MouseEventFlag {
        MouseEventCreatedDoubleClick = 0x01,//表示Qt已从此事件创建了MouseButtonDblClick事件。该标志在导致MouseButtonPress中设置,而不是在生成的MouseButtonDblClick中
        MouseEventFlagMask = 0xFF
    };

你可能感兴趣的:(QT 事件系统之QMouseEvent鼠标事件)