宁波网站建设高端,wordpress当前文章id,游戏网站首页模板,个人备案网站可以做商城展示目录 1. 事件介绍
2. 事件的处理
示例1#xff1a;处理鼠标进入和离开
示例2#xff1a;当鼠标点击时#xff0c;获取对应的坐标值#xff1b;
3. 按键事件
3.1 单个按键
3.2 组合按键
4. 鼠标事件
4.1 鼠标单击事件
4.2 鼠标释放事件
4.3 鼠标双击事件
4.4 鼠标…目录 1. 事件介绍
2. 事件的处理
示例1处理鼠标进入和离开
示例2当鼠标点击时获取对应的坐标值
3. 按键事件
3.1 单个按键
3.2 组合按键
4. 鼠标事件
4.1 鼠标单击事件
4.2 鼠标释放事件
4.3 鼠标双击事件
4.4 鼠标移动事件
4.5 滚轮事件
5. 定时器
5.1 QTimerEvent 类
5.2 QTimer 类
5.3 获取系统日期及时间
6. 事件分发器
6.1 概述
6.2 事件分发器工作原理
编辑7. 事件过滤器 1. 事件介绍 前面我们学习了信号槽它是用户进行的各种操作可能会产生出信号程序员给某个信号指定槽函数当信号触发时就能够自动的执行到对应的槽函数。事件和信号槽非常类似用户进行的各种操作也会产生事件。程序员同样可以给事件关联上处理函数处理的逻辑当事件触发的时候就能够执行到对应的代码。 事件本身是操作系统提供的机制Qt 也同样把操作系统事件机制进行了封装拿到了Qt 中但是由于事件对应的代码编写起来不是很方便所以 Qt 对于事件机制又进行了进一步的封装就得到了信号槽。信号槽就是对于事件的进一步封装事件是信号槽的底层机制。 事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘或者是窗口需要重新绘制的时候都会发出一个相应的事件。一些事件是在用户操作时发出如键盘事件、鼠标事件等另一些事件则是由系统本身自动发出如定时器事件。常见的 Qt 事件如下 常见事件描述
事件名称描述鼠标事件鼠标左键、鼠标右键、鼠标滚轮鼠标的移动鼠标按键的按下和松开键盘事件按键类型、按键按下、按键松开定时器事件定时时间到达进入离开事件鼠标的进入和离开滚轮事件鼠标滚轮滚动绘屏事件重绘屏幕的某些部分显示隐藏事件窗口的显示和隐藏移动事件窗口位置的变化窗口事件是否为当前窗口大小改变事件窗口大小改变焦点事件键盘焦点移动拖拽事件用鼠标进行拖拽
2. 事件的处理
事件处理一般常用的方法为重写相关的 Event 函数。
在 Qt 中几乎所有的 Event 函数都是虚函数所以可以重新实现。如在实现鼠标的进入和离开事件时直接重新实现 enterEvent() 和 leaveEvent() 即可。enterEvent() 和 leaveEvent() 函数原型如下 示例1处理鼠标进入和离开
1、新建 Qt 项目基类选择 QWidget同时勾选 UI 界面文件如下图示 2、设计 UI 文件如下图示 3、这里需要创建 QLabel 的子类重写 enterEvent 和 leaveEvent在项目中新添加一个类MyLabel
先选中项目名称 enterEventAndleaveEvent点击鼠标右键选择 add new ... 弹出如下对话框 4、选择Choose .... 弹出如下界面 5、此时项目中会新添加以下两个文件 6、要想重写父类的函数就需要确保你这边写的函数名字和函数的参数列表都完全一致形参名无所谓为了防止单词拼写错误我们可以在帮助文档中查找对应的内容 7、点击 显示 之后出现如下内容 8、复制 enterEvent() 和 leaveEvent() 粘贴在项目文件 mylabel.h 中 9、重写 enterEvent() 和 leaveEvent() 方法 10、上述代码虽然重写了这俩函数但是还是有点问题。运行程序我们会发现鼠标进入和移出界面上没有一点反应。这是因为当前在界面上创建的这个 label 其实是 QLabel不是咋们自己写的 Label咋们必须要确保界面上的这个 label 是一个咋们自己定义的 Label 类的实例程序才会执行到。解决办法也很简单在 UI 文件中选中 Label右键 ------ 提升为... 11、当点击 提升为... 之后弹出如下对话框 12、修改基类 13、执行效果如下当鼠标进入设计好的标签之后就会在应用程序输出栏中打印鼠标进入 示例2当鼠标点击时获取对应的坐标值
鼠标左键点击时打印对应的坐标值鼠标右键点击时打印基于屏幕的坐标 mousePressEvent 这个函数按下左键、右键、滚轮都能触发有的鼠标还带有前进后退侧键也是可以触发的但是还有的鼠标有着更多的按键这就不一定能触发了~ 1、在上述示例的基础上在 mylabel.h 中声明 mousePressEvent() 方法 2、在 mylabel.cpp 中重写 mousePressEvent() 方法 实现效果如下 3. 按键事件 Qt 中的按键事件是通过 QKeyEvent 类来实现的。当键盘上的按键被按下或者被释放时键盘事件便会触发。在帮助文档中查找 QKeyEvent 类如下 查找按键事件中所有的按键类型在帮助文档中输入Qt::Key如下图 3.1 单个按键
示例当某个按键被按下时输出某个按键被按下了1、新建项目在头文件 widget.h 中声明虚函数 keyPressEvent() 2、在 widget.cpp 文件中重写 keyPressEvent() 虚函数 实现效果如下 3.2 组合按键
在 Qt 助手中搜索Qt::KeyboardModifier如下图示 Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中键盘事件可以与修改键一起使用以实现一些复杂的交互操作。KeyboardModifier 中修改键的具体描述如下
Qt::NoModifier无修改键Qt::ShiftModifierShift 键Qt::ControlModifierCtrl 键Qt::AltModifierAlt 键Qt::MetaModifierMeta键在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 鼠标滚轮 示例鼠标左键 右键 滚轮
1、在 widget.h 头文件中声明鼠标按下事件 2、在 widget.cpp 文件中重新实现 mousePressEvent() 函数 实现效果如下 4.2 鼠标释放事件
鼠标释放事件是通过虚函数 mouseReleaseEvent() 来捕获的。mouseReleaseEvent() 函数原型如下
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event 示例鼠标左键释放
1、在 widget.h 头文件中声明鼠标释放事件 2、在 widget.cpp 文件中重新实现 mouseReleaseEvent() 函数 实现效果如下 4.3 鼠标双击事件
鼠标双击事件是通过虚函数mouseDoubleClickEvent() 来实现的。mouseDoubleClickEvent() 函数原型如下
[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event) 示例鼠标左键双击
1、在 widget.h 头文件中声明鼠标双击事件 2、在 widget.cpp 文件中重新实现 mouseDoubleClickEvent() 函数 实现效果如下 4.4 鼠标移动事件
鼠标移动事件是通过虚函数mouseMoveEvent() 来实现的。同时为了实时捕获鼠标位置信息需要通过函数 setMouseTracking() 来追踪鼠标的位置。
mouseMoveEvent()函数原型如下
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)
setMouseTracking()函数原型如下
void setMouseTracking(bool enable) 说明 鼠标移动不同于鼠标按下。随便移动一下鼠标就会产生出大量的鼠标移动事件。当你进行捕获事件的时候尤其是在这里在进行一些复杂逻辑的时候程序负担就很重很容易产生卡顿之类的情况。 Qt 为了保证程序的流畅性默认情况下不会对鼠标移动进行追踪鼠标移动的时候不会调用 mouseMoveEvent。除非显示告诉 Qt 要追踪鼠标位置。 setMouseTracking() 函数默认是 false需要设置为 true才能实时捕获鼠标位置信息。否则只有当鼠标按下时才能捕获其位置信息。 示例
1、在 widget.h 头文件中声明鼠标移动事件 2、在 widget.cpp 文件中重新实现 mouseMoveEvent() 函数 执行效果 4.5 滚轮事件
在 Qt 中鼠标滚轮事件是通过 QWheelEvent 类来实现的。滚轮滑动的距离可以通过 delta() 函数获取。delta() 函数原型如下
int QGraphicsSceneWheelEvent::delta() const
其中返回值代表滚轮滑动的距离。正数表示滚轮相对于用户向前滑动负数表示滚轮相对于用户向后滑动。 示例
1、在 widget.h 头文件中声明鼠标滚轮事件 2、在 widget.cpp 文件中重新实现 wheelEvent() 函数 执行效果 5. 定时器 Qt 中在进行窗口程序的处理过程中经常要周期性的执行某些操作或者制作一些动画效果使用定时器就可以实现。所谓定时器就是在间隔一定时间后去执行某⼀个任务。定时器在很多场景下都会使用到如弹窗自动关闭之类的功能等。
Qt中的定时器分为 QTimerEvent 和 QTimer 这2个类
QTimerEvent类 用来描述一个定时器事件。在使用时需要通过 startTimer() 函数来开启一个定时器这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间它返回的整型值代表这个定时器。当定时器溢出时即定时时间到达就可以在 timerEvent() 函数中获取该定时器的编号来进行相关操作。QTimer类 来实现一个定时器它提供了更高层次的编程接口如可以使用信号和槽还可以设置只运行一次的定时器。
5.1 QTimerEvent 类
示例1在UI界面上放置两个 Label 控件⼀个让其1秒数字累加⼀次⼀个让其2秒数字累加⼀次。
1、新建项目在UI界面文件放置两个 Label 控件 2、在 widget.h 头文件中声明 timerEvent() 函数并定义两个整型变量 3、在 widget.cpp 文件中重写 timerEvent() 函数 实现效果如下 5.2 QTimer 类
示例在UI界面放置一个 Label 标签两个按钮分别是 开始 和 停止 当点击 开始 按钮时开始每隔1秒计数⼀次点击 停止 按钮时暂停计数。
1、设计 UI 界面如下 2、在 widget.cpp 文件中实现对应功能 实现效果如下 5.3 获取系统日期及时间
在 Qt 中获取系统的日期及实时时间可以通过 QTimer 类 和 QDateTime类。
QDateTime类 提供了字符串格式的时间。字符串形式的时间输出格式由 toString() 方法中的 format 参数列表决定可用的参数列表如下 示例获取系统日期及实时时间
1、设计UI界面文件放置⼀个 Label控件用来显示日期及时间放置两个按钮开始 和 停止 ; 2、在 widget.h 头文件中声明更新时间的槽函数 3、在 widget.cpp 文件中实现对应功能 实现效果如下 6. 事件分发器
6.1 概述 在 Qt 中事件分发器(Event Dispatcher) 是⼀个核心概念用于处理 GUI 应用程序中的事件。事件分发器负责将事件从⼀个对象传递到另⼀个对象直到事件被处理或被取消。每个继承自 QObject类 或 QObject类 本身都可以在本类中重写 bool event(QEvent *e) 函数来实现相关事件的捕获和拦截。
6.2 事件分发器工作原理 在 Qt 中我们发送的事件都是传给了 QObject 对象更具体点是传给了 QObject 对象的 event() 函数。所有的事件都会进入到这个函数里面那么我们处理事件就要重写这个 event() 函数。event() 函数本身不会去处理事件而是根据 事件类型type值调用不同的事件处理函数。事件分发器就是工作在应用程序向下分发事件的过程中如下图 如上图事件分发器用于分发事件。在此过程中事件分发器也可以做拦截操作。事件分发器主要是通过 bool event(QEvent *e) 函数来实现。其返回值为布尔类型若为 ture代表拦截不向下分发。 Qt 中的事件是封装在 QEvent类 中在 Qt 助手中输入 QEvent 可以查看其所包括的事件类型如下图示 示例
1、在 widget.h 头文件中声明 鼠标点击事件 和 事件分发器如下图示 2、在 widget.cpp 文件中实现 鼠标点击事件 和 拦截事件 执行结果如下
7. 事件过滤器 在 Qt 中一个对象可能经常要查看或拦截另外一个对象的事件如对话框想要拦截按键事件不让别的组件接收到或者修改按键的默认值等。通过前面学习过的知识我们已经知道Qt 创建了 QEvent事件 对象之后会调用QObject 的 event()函数 处理事件的分发。显然我们可以在 event()函数 中实现拦截的操作。由于 event()函数是 protected 的因此需要继承已有类。如果组件很多就需要重写很多个event()函数。这当然相当麻烦更不用说重写 event()函数还得小心一堆问题。好在 Qt 提供了另外一种机制来达到这一目的事件过滤器。
事件过滤器是在应用程序分发到 event事件分发器 之前再做⼀次更高级的拦截。如下图示 事件过滤器的一般使用步骤
安装事件过滤器 重写事件过滤器函数eventfilter() 。 示例
1、新建 Qt 项目基类选择 QWidget同时勾选 UI 界面文件如下图示 2、设计 UI 文件如下图示 3、在项目新添加⼀个类MyLabel
先选中项目名称 QEvent点击鼠标右键选择 add new ... 弹出如下对话框 4、选择Choose .... 弹出如下界面 5、此时项目中会新添加以下两个文件 6、在 UI 文件中选中 Label右键 ------ 提升为... 7、当点击 提升为... 之后弹出如下对话框 8、在 mylabel.h 中声明 鼠标点击事件 和 事件分发器 9、在 mylabel.cpp 文件中实现鼠标点击事件和事件分发器 10、在 widget.h 头文件中声明事件过滤器函数 11、在 widget.cpp 文件中实现事件过滤器的两个步骤 执行结果如下所示