文章目录
1 🍑事件介绍🍑
事件是应⽤程序内部或者外部产⽣的事情或者动作的统称。在 Qt 中使⽤⼀个对象来表⽰⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent
。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当⽤⼾按下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在⽤⼾操作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常⻅的 Qt 事件如下:
常⻅事件描述:
事件名称 | 描述 |
---|---|
⿏标事件 | ⿏标左键、⿏标右键、⿏标滚轮,⿏标的移动,⿏标按键的按下和松开 |
键盘事件 | 按键类型、按键按下、按键松开 |
定时器事件 | 定时时间到达 |
进⼊离开事件 | ⿏标的进⼊和离开 |
滚轮事件 | ⿏标滚轮滚动 |
绘屏事件 | 重绘屏幕的某些部分 |
显⽰隐藏事件 | 窗⼝的显⽰和隐藏 |
移动事件 | 窗⼝位置的变化 |
窗⼝事件 | 是否为当前窗⼝ |
⼤⼩改变事件 | 窗⼝⼤⼩改变 |
焦点事件 | 键盘焦点移动 |
拖拽事件 | ⽤⿏标进⾏拖拽 |
2 🍑事件的处理🍑
事件处理⼀般常⽤的⽅法为:重写相关的 Event
函数。
在 Qt 中,⼏乎所有的 Event
函数都是虚函数,所以可以重新实现。如:在实现⿏标的进⼊和离开事件时,直接重新实现 enterEvent() 和 leaveEvent() 即可。enterEvent() 和 leaveEvent() 函数原型如下:
示例:创建一个项目,项目里面添加一个新的类,比如MyLabel,然后让该类继承自Label,重写对应的方法:
点击ui文件,增加一个Label,右键点击提升为,然后输入我们新增加的类名,点击增加以及提升。(我这里是已经提升过了的)
然后运行程序:
通过应用程序输出我们可以很直观感觉到鼠标进入Label以及退出Label时的改变。
3 🍑按键事件🍑
Qt 中的按键事件是通过 QKeyEvent
类来实现的。当键盘上的按键被按下或者被释放时,键盘事件便会触发。在帮助⽂档中查找 QKeyEvent
类如下:
3.1 🍎单个按键🍎
⽰例:当某个按键被按下时,输出:某个按键被按下了。
新建项⽬,在头⽂件 “widget.h” 中声明虚函数 keyPressEvent()
;
在 “widget.cpp” ⽂件中重写 keyPressEvent()
虚函数;
此时当我们点击按键a(A也可以,不区分大小写)
时就会打印出我们想要的信息。
3.2 🍎组合按键🍎
Qt::KeyboardModifier
中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键⼀起使⽤,以实现⼀些复杂的交互操作。KeyboardModifier
中修改键的具体描述如下:
Qt::NoModifier | ⽆修改键 |
---|---|
Qt::ShiftModifier | Shift 键 |
Qt::ControlModifier | Ctrl 键 |
Qt::AltModifier | Alt 键 |
Qt::MetaModifier | Meta键(在Windows上指Windows键,在macOS上指Command键) |
Qt::KeypadModifier | 使⽤键盘上的数字键盘进⾏输⼊时,Num Lock键处于打开状态 |
Qt::GroupSwitchModifier | ⽤于在输⼊法 组之间 切换 |
代码示例:
4 🍑鼠标事件🍑
在 Qt 中,⿏标事件是⽤ QMouseEvent
类来实现的。当在窗⼝中按下⿏标或者移动⿏标时,都会产⽣⿏标事件。利⽤ QMouseEvent
类可以获取⿏标的哪个键被按下了以及⿏标的当前位置等信息。在 Qt 帮助⽂档中查找QMouseEvent
类 如下图⽰:
4.1 🍎鼠标单击事件🍎
在 Qt 中,⿏标按下是通过虚函数 mousePressEvent()
来捕获的。mousePressEvent() 函数原型如下:
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)
⿏标左右键及滚的表⽰如下:
Qt::LeftButton ⿏标左键
Qt::RightButton ⿏标右键
Qt::MidButton ⿏标滚轮
代码示例:
结果验证:
使用右键,滚轮也是一个道理,这里就不再演示了。
4.2 🍎鼠标释放事件🍎
⿏标释放事件是通过虚函数 mouseReleaseEvent()
来捕获的。mouseReleaseEvent()
函数原型如下:
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)
⽰例:
结果验证:
4.3 🍎鼠标双击事件🍎
⿏标双击事件是通过虚函数:mouseDoubleClickEvent()
来实现的。mouseDoubleClickEvent()
函数原型如下:
[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
⽰例:⿏标左键双击
结果验证:
4.4 🍎鼠标移动事件🍎
⿏标移动事件是通过虚函数:mouseMoveEvent()
来实现的。同时为了实时捕获⿏标位置信息,需要通过函数 setMouseTracking()
来追踪⿏标的位置。
mouseMoveEvent()
函数原型如下:
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)
setMouseTracking()
函数原型如下:
void setMouseTracking(bool enable)
说明:
setMouseTracking()
函数默认是 false
,需要设置为 true
,才能实时捕获⿏标位置信息。否则只有当⿏标按下时才能捕获其位置信息。
代码⽰例:
结果验证:
4.5 🍎滚轮事件🍎
在 Qt 中,⿏标滚轮事件是通过 QWheelEvent
类来实现的。滚轮滑动的距离可以通过 delta()
函数获取。delta() 函数原型如下:
int QGraphicsSceneWheelEvent::delta() const
其中返回值代表滚轮滑动的距离。正数表⽰滚轮相对于⽤⼾向前滑动,负数表⽰滚轮相对于⽤⼾向后滑动。
代码示例:
结果验证:
5 🍑定时器🍑
Qt 中在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀个任务。定时器在很多场景下都会使⽤到,如弹窗⾃动关闭之类的功能等。
Qt中的定时器分为 QTimerEvent
和 QTimer
这2个类。
QTimerEvent
类⽤来描述⼀个定时器事件。在使⽤时需要通过startTimer()
函数来开启⼀个定时器,这个函数需要输⼊⼀个以毫秒为单位的整数作为参数来表明设定的时间,它返回的整型值代表这个定时器。当定时器溢出时(即定时时间到达)就可以在timerEvent()
函数中获取该定时器的编号来进⾏相关操作。QTimer
类来实现⼀个定时器,它提供了更⾼层次的编程接⼝,如:可以使⽤信号和槽,还可以设置只运⾏⼀次的定时器。
5.1 🍎QTimerEvent 类🍎
⽰例:在UI界⾯上放置两个 Label 控件,⼀个让其1秒数字累加⼀次,⼀个让其2秒数字累加⼀次。
首先现在界面上设置两个Label,在 “widget.h” 头⽂件中声明 timerEvent()
函数,并定义两个整型变量:
然后在 “widget.cpp” ⽂件中重写 timerEvent()
函数:
结果验证:
5.2 🍎QTimer 类🍎
⽰例:在UI界⾯放置⼀个 Label 标签,两个按钮,分别是 “开始” 和 “停⽌” ,当点击 “开始” 按钮时,开始每隔1秒计数⼀次,点击 “停⽌” 按钮时,暂停计数。
头文件:
源文件:
结果验证:
5.3 🍎获取系统日期及时间🍎
在 Qt 中,获取系统的⽇期及实时时间可以通过 QTimer
类 和 QDateTime
类。QDateTime类 提供了字符串格式的时间。字符串形式的时间输出格式由 toString()
⽅法中的 format
参数列表决定,可⽤的参数列表如下:
⽰例:获取系统⽇期及实时时间。
代码示例:
结果验证: