Qt 程序需要在main()函数创建一个QCoreApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行
exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于
QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对
象按照它们不同的类型,分发给不同的事件处理器(event handler)。
如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。
鼠标事件
1 void mousePressEvent(QMouseEvent *event); //单击
2 void mouseReleaseEvent(QMouseEvent *event); //释放
3 void mouseDoubleClickEvent(QMouseEvent *event); //双击
4 void mouseMoveEvent(QMouseEvent *event); //移动
5 void wheelEvent(QWheelEvent *event); //滑轮
鼠标事件使用的时候,加头文件
#include <QMouseEvent>
1 // 鼠标按下事件
2 void Widget::mousePressEvent(QMouseEvent *event)
3 {
4 // 如果是鼠标左键按下 改变指针形状,并且存储当前指针位置与窗口位置的差值。
5 if(event->button() == Qt::LeftButton){
6 ···
7 }
8 // 如果是鼠标右键按下
9 else if(event->button() == Qt::RightButton){
10 ···
11 }
12 }
13 // 鼠标移动事件 默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发:setMouseTracking(true);
14 void Widget::mouseMoveEvent(QMouseEvent *event)
15 {
16 // 这里必须使用buttons()
17 if(event->buttons() & Qt::LeftButton){ //进行的按位与
18 ···
19 }
20 }
21 // 鼠标释放事件
22 void Widget::mouseReleaseEvent(QMouseEvent *event)
23 {
24 ···
25 }
26 // 鼠标双击事件
27 void Widget::mouseDoubleClickEvent(QMouseEvent *event)
28 {
29 // 如果是鼠标左键按下
30 if(event->button() == Qt::LeftButton){
31
32 ···
33 }
34 }
35 // 滚轮事件
36 void Widget::wheelEvent(QWheelEvent *event)
37 {
38 // 当滚轮远离使用者时
39 if(event->delta() > 0){
40 ···
41 }else{//当滚轮向使用者方向旋转时
42 ···
43 }
44 }
键盘事件
1 void keyPressEvent(QKeyEvent *event);
2 void keyReleaseEvent(QKeyEvent *event);
键盘事件使用时,加头文件
#include <QKeyEvent>
1 // 键盘按下事件
2 void Widget::keyPressEvent(QKeyEvent *event)
3 {
4 // 是否按下Ctrl键 特殊按键
5 if(event->modifiers() == Qt::ControlModifier){
6 // 是否按下M键 普通按键 类似
7 if(event->key() == Qt::Key_M)
8 ···
9 }
10 else QWidget::keyPressEvent(event); //保存默认事件
11
12 //如果是处理两个普通按键,得避免自动重复,释放中也要处理
13 if(event->key() == Qt::Key_Up){
14 // 按键重复时不做处理
15 if(event->isAutoRepeat()) return;
16 // 标记向上方向键已经按下
17 keyUp = true;
18 }else if(event->key() == Qt::Key_Left){
19 if(event->isAutoRepeat()) return;
20 keyLeft = true;
21 }
22
23 }
24 // 按键释放事件
25 void Widget::keyReleaseEvent(QKeyEvent *event)
26 {
27 ···
28
29 //如果是处理两个普通按键,得避免自动重复
30 if(event->key() == Qt::Key_Up){
31 if(event->isAutoRepeat()) return;
32
33 ···
34
35 }
36 else if(event->key() == Qt::Key_Left){
37 if(event->isAutoRepeat()) return;
38 ···
39
40 }
41
42 }
分类:
Qt
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)