在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的组合。对于鼠标移动事件,这是按下的所有按钮。对于鼠标按下和双击事件,这包括导致事件的按钮。对于鼠标释放事件,这将排除导致事件的按钮。
鼠标按键类型:鼠标左键,右键,中键等
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,
...
描述鼠标事件的来源,常用于判断鼠标事件是否是来自于其他设备(比如触摸屏)的人造鼠标事件。比如将触摸事件模拟成鼠标事件
enum MouseEventSource {
MouseEventNotSynthesized,
MouseEventSynthesizedBySystem,
MouseEventSynthesizedByQt,
MouseEventSynthesizedByApplication
};
enum MouseEventFlag {
MouseEventCreatedDoubleClick = 0x01,//表示Qt已从此事件创建了MouseButtonDblClick事件。该标志在导致MouseButtonPress中设置,而不是在生成的MouseButtonDblClick中
MouseEventFlagMask = 0xFF
};