【Qt事件】定时器事件 目录1.5.1 QTimerEvent 类1.5.2 QTimer类1.5.3 获取系统日期及时间1.6 事件分发器1.6.1 概述1.6.2 事件分发器工作原理1.7 事件过滤器书接上回 【Qt系统相关】鼠标事件-CSDN博客Qt 中在进⾏窗⼝程序的处理过程中经常要周期性的执⾏某些操作或者制作⼀些动画效果使⽤定时器就可以实现。所谓定时器就是在间隔⼀定时间后去执⾏某⼀个任务。定时器在很多场景下都会使⽤到如弹窗⾃动关闭之类的功能等。Qt中的定时器分为QTimerEvent和QTimer这2个类。•QTimerEvent类 ⽤来描述⼀个定时器事件。在使⽤时需要通过 startTimer() 函数来开启⼀个定时器这个函数需要输⼊⼀个以毫秒为单位的整数作为参数来表明设定的时间它返回的整型值代表这个定时器。当定时器溢出时即定时时间到达就可以在 timerEvent() 函数中获取该定时器的编号来进⾏相关操作。•QTimer类 来实现⼀个定时器它提供了更⾼层次的编程接⼝如可以使⽤信号和槽还可以设置只运⾏⼀次的定时器。1.5.1QTimerEvent 类⽰例1在UI界⾯上放置两个 Label 控件⼀个让其1秒数字累加⼀次⼀个让其2秒数字累加⼀次。1、新建项⽬在UI界⾯⽂件放置两个 Label 控件2、在 widget.h 头⽂件中声明 timerEvent() 函数并定义两个整型变量3、在 widget.cpp ⽂件中重写 timerEvent() 函数实现效果如下1.5.2 QTimer类⽰例在UI界⾯放置⼀个 Label 标签两个按钮分别是 开始 和 停⽌ 当点击 开始 按钮时开始每隔1秒计数⼀次点击 停⽌ 按钮时暂停计数。1、设计 UI 界⾯如下2、在 widget.cpp ⽂件中实现对应功能实现效果如下1.5.3 获取系统日期及时间在 Qt 中获取系统的⽇期及实时时间可以通过 QTimer 类 和 QDateTime类。QDateTime类 提供了字符串格式的时间。字符串形式的时间输出格式由 toString() ⽅法中的format参数列表决定可⽤的参数列表如下⽰例获取系统⽇期及实时时间1、设计UI界⾯⽂件放置⼀个 Label控件⽤来显⽰⽇期及时间放置两个按钮开始 和 停⽌ ;2、在 widget.h 头⽂件中声明更新时间的槽函数3、在 widget.cpp ⽂件中实现对应功能实现效果如下1.6 事件分发器1.6.1 概述在 Qt 中事件分发器(Event Dispatcher) 是⼀个核⼼概念⽤于处理 GUI 应⽤程序中的事件。事件分发器负责将事件从⼀个对象传递到另⼀个对象直到事件被处理或被取消。每个继承⾃ QObject类 或QObject类 本⾝都可以在本类中重写 bool event(QEvent *e) 函数来实现相关事件的捕获和拦截。1.6.2 事件分发器工作原理在 Qt 中我们发送的事件都是传给了 QObject 对象更具体点是传给了 QObject 对象的 event() 函数。所有的事件都会进⼊到这个函数⾥⾯那么我们处理事件就要重写这个 event() 函数。event() 函数本⾝不会去处理事件⽽是根据 事件类型type值调⽤不同的事件处理函数。事件分发器就是⼯作在应⽤程序向下分发事件的过程中如下图如上图事件分发器⽤于分发事件。在此过程中事件分发器也可以做拦截操作。事件分发器主要是通过 bool event(QEvent *e) 函数来实现。其返回值为布尔类型若为 ture代表拦截不向下分发。Qt 中的事件是封装在 QEvent类 中在 Qt 助⼿中输⼊ QEvent 可以查看其所包括的事件类型如下图⽰⽰例1、在 widget.h 头⽂件中声明 ⿏标点击事件 和 事件分发器如下图⽰2、在 widget.cpp ⽂件中实现 ⿏标点击事件 和 拦截事件执⾏结果如下1.7 事件过滤器在 Qt 中⼀个对象可能经常要查看或拦截另外⼀个对象的事件如对话框想要拦截按键事件不让别的组件接收到或者修改按键的默认值等。通过上⾯的学习我们已经知道Qt 创建了 QEvent事件对象之后会调⽤QObject 的 event()函数 处理事件的分发。显然我们可以在 event()函数 中实现拦截的操作。由于 event()函数是 protected 的因此需要继承已有类。如果组件很多就需要重写很多个event()函数。这当然相当⿇烦更不⽤说重写 event()函数还得⼩⼼⼀堆问题。好在 Qt 提供了另外⼀种机制来达到这⼀⽬的事件过滤器。事件过滤器是在应⽤程序分发到 event事件分发器 之前再做⼀次更⾼级的拦截。如下图⽰事件过滤器的⼀般使⽤步骤1、安装事件过滤器2、重写事件过滤器函数eventfilter() 。⽰例1、新建 Qt 项⽬基类选择 QWidget同时勾选 UI 界⾯⽂件如下图⽰2、设计 UI ⽂件如下图⽰3、在项⽬新添加⼀个类MyLabel先选中项⽬名称 QEvent点击⿏标右键选择 add new ... 弹出如下对话框4、选择Choose .... 弹出如下界⾯5、此时项⽬中会新添加以下两个⽂件6、在 UI ⽂件中选中 Label右键 ------ 提升为...7、当点击 提升为... 之后弹出如下对话框6、在 mylabel.h 中声明 ⿏标点击事件 和 事件分发器7、在 mylabel.cpp ⽂件中实现⿏标点击事件和事件分发器8、在 widget.h 头⽂件中声明事件过滤器函数9、在 widget.cpp ⽂件中实现事件过滤器的两个步骤执⾏结果如下所⽰