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