QMouseEvent 鼠标事件理论
- 一、概述
- 二、鼠标事件的传递
- 三、组合修饰符
- 四、鼠标坐标位置
- 五、使用方式
一、概述
当在QWidget窗口内的鼠标按钮被按下或释放,或者鼠标光标被移动时,就会发生鼠标事件。
鼠标按下释放没有什么特殊的,但是鼠标移动事件比较特殊,只有当鼠标按钮被按下时,鼠标移动事件才会发生,除非使用 QWidget::setMouseTracking()函数去启用了鼠标跟踪。
- QWidget::setMouseTracking(bool enable)
如果禁用了鼠标跟踪(默认),则只有在鼠标移动过程中至少按下一个鼠标按钮时,Widget才会接收鼠标移动事件。
如果启用了鼠标跟踪,即使没有按下按钮,widget也会接收鼠标移动事件。
二、鼠标事件的传递
当widget内的鼠标按键被按下时,Qt会自动抓取鼠标;Widget将继续接收鼠标事件,直到释放最后一个鼠标按钮。
鼠标事件包含一个特殊的accept标志,表示接收者是否想要这个事件。如果widget没有处理鼠标事件,就应该调用ignore()。这个就操作就可以让鼠标事件在父Widget链中向上传播,直到Widget使用accept()接受它,或者事件过滤器使用它。
注意:如果一个鼠标事件被传播到一个设置了Qt:: wa_nomoussepropagation的Widget上,那么这个鼠标事件将不会在父Widget链上进一步传播。
三、组合修饰符
键盘修饰键的状态可以通过调用从QInputEvent继承的modifiers()函数来找到。
就像 在鼠标移动的时候我同时按住一些 shift 或着 alt之类的。这个可以是同时被按下多个键的哈,
标识名 | 值 | 含义 |
---|---|---|
Qt::NoModifier | 0x00000000 | 没修饰键按下 |
Qt::ShiftModifier | 0x02000000 | Shift 按下 |
Qt::ControlModifier | 0x04000000 | Ctrl 按下 |
Qt::AltModifier | 0x08000000 | Alt 按下 |
Qt::MetaModifier | 0x10000000 | Meta 按下 |
四、鼠标坐标位置
函数pos()、x()和y()给出了鼠标相对于接收鼠标事件的Widget的位置。
如果在鼠标事件发生后移动了Widget,使用globalPos()返回的全局位置来避免抖动。这个globalPos() 其实是鼠标在整个屏幕平面的位置,而pos()是指这个鼠标在这个窗口的位置。
五、使用方式
函数QWidget::setEnabled()可用于启用或禁用Widget的鼠标和键盘事件。
要使用这个事件函数的时候,就需要重新实现QWidget事件处理程序,即继承QWidget窗口去重写QWidget::mousePressEvent()、QWidget::mouseReleaseEvent()、QWidget::mouseDoubleClickEvent()和QWidget::mouseMoveEvent(),在自己的Widget中接收鼠标事件即可。当然也可以不去继承,直接使用事件过滤器也可以用的哈。