【Qt系统相关】鼠标事件
目录一、Qt事件1.1 事件介绍1.2 事件的处理1.3 按键事件1.3.1 单个按键1.3.2 组合按键1.4 鼠标事件1.4.1 鼠标单击事件1.4.2 鼠标释放事件1.4.3 鼠标双击事件1.4.4 鼠标移动事件1.4.5 滚轮事件一、Qt事件1.1 事件介绍事件是应⽤程序内部或者外部产⽣的事情或者动作的统称。在 Qt 中使⽤⼀个对象来表⽰⼀个事件。所 有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当⽤⼾按 下⿏标、敲下键盘或者是窗⼝需要重新绘制的时候都会发出⼀个相应的事件。⼀些事件是在⽤⼾ 作时发出如键盘事件、⿏标事件等另⼀些事件则是由系统本⾝⾃动发出如定时器事件。常⻅的 Qt 事件如下常⻅事件描述事件名称描述鼠标事件左键、右键、滚轮、移动、按下和松开键盘事件按键类型、按键按下和松开定时器事件定时时间到达进入离开事件鼠标的进入和离开滚轮事件滚动绘屏事件重新绘屏幕的某些部分显示隐藏事件窗口的显示和隐藏移动事件窗口位置的变化窗口事件是否为当前窗口大小改变事件窗口大小改变焦点事件键盘焦点移动拖拽事件用鼠标进行拖拽1.2 事件的处理事件处理⼀般常⽤的⽅法为重写相关的 Event 函数。在 Qt 中⼏乎所有的 Event 函数都是虚函数所以可以重新实现。如在实现⿏标的进⼊和离开事件时直接重新实现 enterEvent() 和 leaveEvent() 即可。enterEvent() 和 leaveEvent() 函数原型如下示例11、新建 Qt 项目基类选择 QWidget同时勾选 UI 界面文件如下图示2、设计 UI 文件如下图示3、在项目中新添加一个类MyLabel先选中项目名称 QEvent点击鼠标右键选择 add new ... 弹出如下对话框4、选择Choose .... 弹出如下界面5、此时项目中会新添加以下两个文件6、在帮助⽂档中查找对应的内容7、点击 显⽰ 之后出现如下内容8、复制 enterEvent() 粘贴在项⽬⽂件 mylabel.h 中9、重写 enterEvent() ⽅法10、在 UI ⽂件中选中 Label右键 ------ 提升为...11、当点击 提升为... 之后弹出如下对话框12、修改基类13、执⾏效果如下当⿏标进⼊设计好的标签之后就会在应⽤程序输出栏中打印⿏标进⼊⽰例2当⿏标点击时获取对应的坐标值1、在上述⽰例的基础上在 mylabel.h 中声明 mousePressEvent() ⽅法2、在 mylabel.cpp 中重写 mousePressEvent() ⽅法实现效果如下⽰例⿏标左键点击时打印对应的坐标值⿏标右键点击时打印基于屏幕的坐标1.3 按键事件Qt 中的按键事件是通过 QKeyEvent 类来实现的。当键盘上的按键被按下或者被释放时键盘事件便会触发。在帮助⽂档中查找 QKeyEvent 类如下查找按键事件中所有的按键类型在帮助⽂档中输⼊Qt::Key如下图1.3.1 单个按键⽰例当某个按键被按下时输出某个按键被按下了1、新建项⽬在头⽂件 widget.h 中声明虚函数 keyPressEvent()如下图2、在 widget.cpp ⽂件中重写 keyPressEvent() 虚函数1.3.2 组合按键在 Qt 助⼿中搜索Qt::KeyboardModifier如下图⽰Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中键盘事件可以与修改键 ⼀起使⽤以实现⼀些复杂的交互操作。KeyboardModifier 中修改键的具体描述如下Qt::NoModifier⽆修改键Qt::ShiftModifierShift 键Qt::ControlModifierCtrl 键Qt::AltModifierAlt 键Qt::MetaModifierMeta键在Windows上指Windows键在macOS上指Command键Qt::KeypadModifie使⽤键盘上的数字键盘进⾏输⼊时Num Lock键处于打开状态Qt::GroupSwitchModifier⽤于在输⼊法 组之间 切换⽰例1.4 鼠标事件在 Qt 中⿏标事件是⽤ QMouseEvent 类来实现的。当在窗⼝中按下⿏标或者移动⿏标时都会产⽣⿏标事件。利⽤ QMouseEvent 类可以获取⿏标的哪个键被按下了以及⿏标的当前位置等信息。在 Qt 帮助⽂档中查找QMouseEvent类 如下图⽰1.4.1 鼠标单击事件在 Qt 中⿏标按下是通过虚函数 mousePressEvent() 来捕获的。mousePressEvent() 函数原型如下[virtualprotected] void QWidget::mousePressEvent(QMouseEvent *event)⿏标左右键及滚的表⽰如下Qt::LeftButton ⿏标左键Qt::RightButton ⿏标右键Qt::MidButton ⿏标滚轮⽰例1⿏标左键1、在 widget.h 头⽂件中声明⿏标按下事件2、在 widget.cpp ⽂件中重新实现 mousePressEvent() 函数实现效果如下⽰例2⿏标右键实现效果如下⽰例3⿏标滚轮实现效果如下1.4.2 鼠标释放事件⿏标释放事件是通过虚函数 mouseReleaseEvent() 来捕获的。mouseReleaseEvent() 函数原型如下[virtualprotected] void QWidget::mouseReleaseEvent(QMouseEvent *event)⽰例执⾏效果如下1.4.3 鼠标双击事件⿏标双击事件是通过虚函数mouseDoubleClickEvent() 来实现的。mouseDoubleClickEvent()函数原型如下[virtualprotected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)⽰例⿏标左键双击执⾏效果如下1.4.4 鼠标移动事件⿏标移动事件是通过虚函数mouseMoveEvent() 来实现的。同时为了实时捕获⿏标位置信息需要通过函数 setMouseTracking() 来追踪⿏标的位置。mouseMoveEvent()函数原型如下[virtualprotected] void QWidget::mouseMoveEvent(QMouseEvent *event)setMouseTracking()函数原型如下void setMouseTracking(bool enable)说明setMouseTracking() 函数默认是 false需要设置为 true才能实时捕获⿏标位置信息。否则只有当⿏标按下时才能捕获其位置信息。⽰例执⾏效果1.4.5 滚轮事件在 Qt 中⿏标滚轮事件是通过 QWheelEvent 类来实现的。滚轮滑动的距离可以通过 delta() 函数获取。delta() 函数原型如下intQGraphicsSceneWheelEvent::delta()const其中返回值代表滚轮滑动的距离。正数表⽰滚轮相对于⽤⼾向前滑动负数表⽰滚轮相对于⽤⼾向后滑动。⽰例执⾏效果如下