一. 事件介绍

事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent
事件是由系统或者 Qt 平台本身在不同时刻发出,当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。
一些事件是在用户操作时发出的,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件。常见的 Qt 事件如下:
在这里插入图片描述
常见事件描述:

事件名称描述
鼠标事件(QMouseEvent)鼠标左键、右键、滚轮,鼠标的移动,鼠标按键的按下和松开
键盘事件(QKeyEvent)按键类型,按键按下,按键松开
定时器事件(QTimerEvent)定时时间到达
进入离开事件鼠标的进入和离开
绘屏事件重绘屏幕的某些部分
显示隐藏事件窗口的显示和隐藏
移动事件窗口位置的变化
窗口事件是否为当前串口
大小改变事件控件大小改变
焦点事件键盘焦点移动
拖拽事件(QDropEvent)用鼠标进行拖拽

信号槽:用户进行的各种操作,都有可能产生信号,可以给某个信号指定槽函数。当信号触发时,就能自动调用对应的槽函数
事件:用户进行的各种操作,也有可能产生事件,我们同样也可以给事件关联上处理函数,当事件触发时,会执行关联函数

事件是信号槽的底层机制,信号槽是事件的进一步封装
实际 Qt 开发,绝大部分和用户之间的交互都是使用 信号槽机制,但也有无法实现的需求(Qt 没有提供对应的信号),此时就可以使用 事件 手动处理响应逻辑

二. 事件的处理

事件处理,是通过 多态 机制,事件处理函数都是虚函数,这些虚函数都封装在 Qt 已有的类。
实现逻辑如下:

  1. 创建子类,继承自 Qt 已有的类
  2. 在子类中重写父类的事件处理函数
  3. 后续时间触发过程中,就会通过多态机制,执行到重写的事件处理函数

1. 移入/移出事件

代码示例:通过继承 QLabel类,并重写鼠标进入和鼠标离开 Label 区域的事件处理函数

API说明
void QWidget::leaveEvent(QEvent *event)当鼠标离开控件区域时触发事件
void QWidget::enterEvent(QEvent *event)当鼠标进入控件区域触发时触发事件
  1. 新建 QWidget 项目,通过设计 UI 文件,添加一个QLabel在这里插入图片描述
  2. 在项目中新建一个类:MyLabel,并继承自 QLabel在这里插入图片描述
  3. 重写 事件处理函数 mylabel.h在这里插入图片描述
    mylabel.cpp在这里插入图片描述
  4. 在 Qt Designer 界面,将 QLabel 提升为 MyLabel在这里插入图片描述在这里插入图片描述
  5. 运行程序,将鼠标移入和移除文本标签,观察效果在这里插入图片描述

2. 鼠标点击事件

代码示例:当鼠标在标签区域内点击时,获取鼠标坐标

涉及的API

API说明
mousePressEvent(QMouseEvent *event)鼠标在控件区域内点击
event->x()/event()->y()不同的事件有不同的属性,此处的 x 和 y 是鼠标相对于控件的坐标
event->globalX()/event->globalY()此处的 x 和 y 是鼠标相对于屏幕的坐标

mylabel.cpp

void MyLabel::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "鼠标按下,相对于控件:(" << event->x() << "," << event->y() << ")";
    qDebug() << "鼠标按下,相对于控件:(" << event->globalX() << "," << event->globalY() << ")";
    qDebug() << "---------------------------";
}

运行结果如下:
在这里插入图片描述


QMouseEvent类 可以通过 button() 函数获取鼠标如何触发该事件(左键/右键…)
函数原型如下:

Qt::MouseButton button()

MouseButton 是一个枚举类
在这里插入图片描述
常用的:

  • LeftButton:左键
  • RightButton:右键
  • MidButton:滚轮键按下

代码示例:点击鼠标左键和右键,显示不同文本

mylabel.cpp

void MyLabel::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
        qDebug() << "鼠标左键按下";
    else if(event->button() == Qt::RightButton)
        qDebug() << "鼠标右键按下";
}

运行结果如下:
在这里插入图片描述

三. 按键事件

Qt 中的按键事件是通过 QKeyEvent类 实现的,当键盘上的按键按下或者被释放时,键盘事件便会触发

通过 QKeyEvent类key() 获取通过哪个按键触发该事件
Qt 通过枚举类Qt::Key区分各个按键
在这里插入图片描述
事件处理函数为:
在这里插入图片描述

代码示例:单个按键按下

void Widget::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_A)
        qDebug() << "按键A被按下";
    else if(event->key() == Qt::Key_B)
        qDebug() << "按键B被按下";
    else if(event->key() == Qt::Key_C)
        qDebug() << "按键C被按下";
}

运行结果如下:
在这里插入图片描述


代码示例:组合按键
Qt 使用 Qt::KeyboardModifier定义在处理键盘事件时对应的修改键。键盘事件可以与修改键一起使用,以实现一些复杂的交互操作
在这里插入图片描述

修改键说明
Qt::NoModifier无修改键
Qt::ShiftModifierShift键
Qt::ControlModifierCtrl键
Qt::AltModfierAlt键
Qt::MetaDifierMeta键(在Windows上指Windows键,在macOS上指Command键)
Qt::KeypadModifier使用键盘上的数字键盘输入时,Num Lock键处于打开状态
Qt::GroupSwithModifier用于在输入法组之间切换

代码示例:判断是否按下组合键

void Widget::keyPressEvent(QKeyEvent *event)
{
    //组合键按下
    if(event->key() == Qt::Key_A && event->modifiers() == Qt::ShiftModifier)
        qDebug() << "Shift + A被按下";
    else if(event->key() == Qt::Key_B && event->modifiers() == Qt::ControlModifier)
        qDebug() << "Ctrl + B被按下";
    else if(event->key() == Qt::Key_C && event->modifiers() == Qt::AltModifier)
        qDebug() << "Alt + C被按下";
}

运行结果如下:
在这里插入图片描述

结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐