Qt 事件总结(鼠标、键盘) QMouseEvent、QKeyEvent

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 }
原文地址:https://www.cnblogs.com/ybqjymy/p/12698864.html