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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM