大理州住房和城乡建设部网站游戏棋牌网站建设

当前位置: 首页 > news >正文

大理州住房和城乡建设部网站,游戏棋牌网站建设,上海太江建设网站,已有网站开发app目录 处理事件 鼠标事件 键盘事件 定时器事件 窗口事件 虽然 Qt 是跨平台的 C 开发框架#xff0c;Qt 的很多能力其实是操作系统提供的 只不过 Qt 封装了系统的 API 事件 前面学习过信号槽#xff1a; 用户进行的各种操作#xff0c;就可能会产生出信号#xff0c;可以…目录 处理事件 鼠标事件 键盘事件 定时器事件 窗口事件 虽然 Qt 是跨平台的 C 开发框架Qt 的很多能力其实是操作系统提供的 只不过 Qt 封装了系统的 API 事件 前面学习过信号槽 用户进行的各种操作就可能会产生出信号可以给某个信号指定槽函数当信号触发时就能够自动的执行到对应的槽函数 事件和信号槽非常类似 用户进行的各种操作也会产生事件程序员同样可以给事件关联上处理函数(处理的逻辑)当事件触发的时候就能够执行到对应的代码 事件本身是操作系统提供的机制Qt 也同样把操作系统事件机制进行了封装拿到了 Qt 中 但是由于事件对应的代码编写起来不是很方便所以 Qt 对于事件机制又进行了进一步的封装就得到了信号槽 信号槽就是对于事件的进一步封装事件是信号槽的底层机制 实际 Qt 开发程序过程中绝大部分和用户之间进行的交互都是通过信号槽来完成的 有些特殊情况下信号槽不一定能搞定(某个用户的动作行为Qt 没有提供对应的信号) 此时就需要通过重写事件处理函数的形式来手动处理事件的啊应逻辑 开发事件机制给咱们程序员咱们就可以根据实际的需要进行更深度的定制化 diy 操作了 用户进行了很多操作就会产生很多的事件(当然也会产生很多的信号) 下面就是开发中比较典型的事件 不同场景下要关注的点是不一样这些事件的子类中就会包含一些对应的不同的属性 处理事件 让一段代码和某个事件关联起来当事件触发的时候就能指定到这段代码 之前信号槽这里通过 connect 来完成上述关联的 对于事件来说还不太一样 让当前的类重写某个事件处理函数这里用到的是多态”机制 创建子类, 继承自 Qt 已有的类在子类中重写父类的事件处理函数 后续事件触发过程中就会通过多态这样的机制执行到咱们自己写的子类的函数中 鼠标事件 下面都是创建 QWidget 的当然也可以创建 QMainWindow因为用不到工具栏所以选择的 QWidget 鼠标进入和鼠标离开事件 下面使用上述方式处理一下鼠标进入(enterEvent)和鼠标离开(leaveEvent)事件 enterEvent 和 leaveEvent 函数都是虚函数所以可以被子类重写 图形化界面的方式创建一个 Label鼠标进入 Label 时提示 enterEvent离开时提示 leaveEvent 为了能清楚看到 Label 的边框将边框选为 Box 效果为 这里需要创建 QLabel 的子类重写 enterEvent 和 leaveEvent 类名就叫 Label父类叫 QLabel 按照以往的习惯创建的 Label 类需要有一个父控件所以在 label.h 中添加 label.cpp 中添加 接着在 label.h 中声明两个需要重写的函数 注意 要想重写父类的函数就需要确保你这边写的函数名字和函数的参数列表都完全一致 (形参名无所谓)谨防单词拼写错误 label.cpp 实现 (void)event 是为了消除警告因为暂时还没用到 event 这个形参 此时运行程序鼠标进入和移出 label 时并没有执行上述逻辑因为 当前在界面上创建的这个 label 其实是 QLabel不是咱们自己写的 Label 必须要确保界面上的这个 label 是一个咱们自己定义的 Label 类的实例才会执行到 右键图形化界面的 label点击提升为 输入提升的类名 Label点击添加再点击提升 一定要确保你的类名以及头文件的名字和上述自定义的类名头文件都匹配 此时右边对象树上面就是 Label 了没提升前显示是 QLabel 通过提升为这样的方式就可以把 Qt Designer 中拖上去的控件的类型转换成自定义的控件类型 此时再运行程序鼠标移入移出 Label 时就会打印下面的内容了 此时就说明当前的 enterEvent 和 leaveEvent 这两个事件就被咱们给捕获到了 通过事件获取到鼠标点击的位置 与上面的操作一样创建一个 Label再创建一个 Label 类父类定为 QLabel并对生成的 Label 的构造函数做一个调整添加一个 QWidget* 的参数以便于能够指定父窗口 接着再右键 Label 点击提升为输入类名后点击提升此时就完成了提升操作 下面就是 mousePressEvent 函数当鼠标按下时就会触发这个函数调用 左键、右键、滚轮、侧键都能触发 在 label.cpp 中实现 mousePressEvent 函数 此时鼠标在 Label 范围内点击就会打印 鼠标点击的位置坐标 上述是以 Label 左上角位置为原点的 下面则是以屏幕左上角为原点获取坐标 也可以加上下面的代码来判断按下的是左键还是右键 通过事件获取到鼠标点击释放按键 与上面的鼠标点击事件一样下面是重写的 mouseReleaseEvent 函数 此时就能做到获取鼠标点击释放按键 clicked 这样的信号就相当于是一次鼠标按下事件和一次鼠标释放事件 通过事件获取到鼠标双击按键 重写的 mouseDoubleEvent 函数如下 鼠标第二次按下的时候,才能够识别到是双击 注意 有的程序可能是单击有一些逻辑双击有另一些逻辑如果我们没注意可能双击操作就能触发单击的逻辑可能就有 bug 通过事件获取到鼠标移动 刚才重写鼠标事件的操作都是在自定义的 Labe| 中完成的此时鼠标只有在 Label 范围内进行动作的时候才能捕获到 也可以把这些操作直接放到 Widget (QWidqet 子类) 来完成这样的话鼠标在整个窗口中进行的各种动作都能获取到了 所以直接在 widget.h widget.cpp 中重写 mouseMoveEvent 函数 此时运行程序并没有效果 鼠标移动不同于鼠标按下 随便移动一下鼠标就会产生出大量的鼠标移动事件当你进行捕获事件的时候尤其是在这里再进行一些复杂逻辑的时候程序负担就很重很容易产生卡顿之类的情况 Qt 为了保证程序的流畅性默认情况下不会对鼠标移动进行追踪鼠标移动的时候不会调用mouseMoveEvent除非显式告诉 Qt 就要追踪鼠标位置 所以需要在 Widget 的构造函数中设置 此时稍微一动鼠标就会一直打印如果移动的比较快就会明显出现打印卡顿的情况 通过事件获取到鼠标滚轮的滚动动作 在 QWheelEvent 中 通过 delta() 获取到这次事件鼠标滚轮滚动了多远 同样在 widget.h widget.cpp 中重写 wheelEvent 函数 滚轮往下滚动就打印 -120往上滚动就打印 120 我们也可以在 Widget 类中新增 int total初始化为0就能在 wheelEvent 函数中实现统计滚轮滚动的距离了 效果为 就可以根据滚轮滚动的操作实现特定的功能比如可以通过滚轮去缩放字体大小可以把滚轮滚动的距离映射到具体的数值上就可以实现类似的效果了 键盘事件 处理键盘按键事件 我们前面学习过的 QShortCut这是信号槽机制封装过的获取键盘按键的方式 站在更底层的角度也可以通过事件获取到当前用户键盘按下的情况 依旧是在 widget.h widget.cpp 中重写 keyPressEvent 函数 按下 ABCDEF 的效果为可以发现每一个按钮都对应一个数字 如果想得知是否按下了具体的某一个键以 A 为例代码改为 也有些场景是组合键 Ctrl A 定时器事件 前面学习了QTimer 实现定时器功能 在 QTimer 背后是 QTimerEvent 定时器事件进行支撑的 QObject 提供了一个 timerEvent 这个函数可以通过定时器周期性的触发一些操作 里面需要搭配 startTimer 启动定时器killTimer 关闭定时器 使用 下面通过图形化的方式拖动一个 LCD Number初始值改为 10 此处 startTimer 的返回值 timerld 类似于 Linux 中的文件描述符起到的是身份标识的效果 因为后面程序可能还会用到 timerld所以在 widget.h 中的构造函数定义为类内成员 在 widget.h widget.cpp 中重写 timerEvent 函数 运行程序每隔一秒-1直到0就停止 使用 timerEvent 比 QTimer 还是要更复杂一点手动管理 timerld还需要区分这次函数调用是哪个 timer 引起的 后续实际开发中使用 QTimer 即可 窗口事件 moveEvent 窗口移动时触发的事件resizeEvent 窗口大小改变时触发的事件 moveEvent QMoveEvent 中有下面两个常用的方法 resizeEvent QResizeEvent 中有下面两个常用的方法 在 widget.h widget.cpp 中重写 moveEvent 和 resizeEvent函数 如果移动 widget 窗口或调整 widget 窗口大小下面就会打印 Qt事件相关知识到此结束