【Qt】Qt系统 | Qt事件 & 按键事件
【Qt】事件
一. 事件介绍
事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent
。
事件是由系统或者 Qt 平台本身在不同时刻发出,当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。
一些事件是在用户操作时发出的,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件。常见的 Qt 事件如下:
常见事件描述:
事件名称 | 描述 |
---|---|
鼠标事件(QMouseEvent) | 鼠标左键、右键、滚轮,鼠标的移动,鼠标按键的按下和松开 |
键盘事件(QKeyEvent) | 按键类型,按键按下,按键松开 |
定时器事件(QTimerEvent) | 定时时间到达 |
进入离开事件 | 鼠标的进入和离开 |
绘屏事件 | 重绘屏幕的某些部分 |
显示隐藏事件 | 窗口的显示和隐藏 |
移动事件 | 窗口位置的变化 |
窗口事件 | 是否为当前串口 |
大小改变事件 | 控件大小改变 |
焦点事件 | 键盘焦点移动 |
拖拽事件(QDropEvent) | 用鼠标进行拖拽 |
信号槽:用户进行的各种操作,都有可能产生信号,可以给某个信号指定槽函数。当信号触发时,就能自动调用对应的槽函数
事件:用户进行的各种操作,也有可能产生事件,我们同样也可以给事件关联上处理函数,当事件触发时,会执行关联函数
事件是信号槽的底层机制,信号槽是事件的进一步封装
实际 Qt 开发,绝大部分和用户之间的交互都是使用 信号槽机制,但也有无法实现的需求(Qt 没有提供对应的信号),此时就可以使用 事件
手动处理响应逻辑
二. 事件的处理
事件处理,是通过 多态
机制,事件处理函数都是虚函数,这些虚函数都封装在 Qt 已有的类。
实现逻辑如下:
- 创建子类,继承自 Qt 已有的类
- 在子类中重写父类的事件处理函数
- 后续时间触发过程中,就会通过多态机制,执行到重写的事件处理函数
1. 移入/移出事件
代码示例:通过继承 QLabel类,并重写鼠标进入和鼠标离开 Label 区域的事件处理函数
API | 说明 |
---|---|
void QWidget::leaveEvent(QEvent *event) | 当鼠标离开控件区域时触发事件 |
void QWidget::enterEvent(QEvent *event) | 当鼠标进入控件区域触发时触发事件 |
- 新建 QWidget 项目,通过设计 UI 文件,添加一个QLabel
- 在项目中新建一个类:MyLabel,并继承自 QLabel
- 重写 事件处理函数
mylabel.h
mylabel.cpp
- 在 Qt Designer 界面,
将 QLabel 提升为 MyLabel
- 运行程序,将鼠标移入和移除文本标签,观察效果
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::ShiftModifier | Shift键 |
Qt::ControlModifier | Ctrl键 |
Qt::AltModfier | Alt键 |
Qt::MetaDifier | Meta键(在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被按下";
}
运行结果如下:
结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)