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 }