一、QMouseEvent的詳細描述
首先請注意,Qt中的QMouseEvent一般只涉及鼠標左鍵或右鍵的單擊、釋放等操作,而對鼠標滾輪的響應則通過QWheeEvent來處理。
QMouseEvent類包含了用於描述鼠標事件的參數。
當在一個窗口里按住鼠標按鍵、或移動、或釋放就會產生鼠標事件QMouseEvent。
鼠標移動事件只會在按下鼠標按鍵的情況下才會發生,除非通過顯式調用QWidget::setMouseTracking()函數來開啟鼠標軌跡,這種情況下只要鼠標指針在移動,就會產生一系列的QT鼠標事件;
在一個窗口中,當鼠標按鍵被按下時,QT會自動捕捉鼠標軌跡,鼠標指針所在的父窗口會繼續接受鼠標事件,直到最后一個鼠標按鍵被釋放。
二、QMouseEvent的傳遞
一個鼠標事件包含一些指定的接受標志flag用於指出該事件是否會被接收和處理 ,如果鼠標指針所在的父窗口不接收該事件則可以調用函數ignore()予以忽略;
多個重疊的窗口在實現里好比一個遞歸的倒立樹,鼠標事件會沿着鼠標指針所在的父窗口的鏈表向上傳遞,直到某個窗口調用accept()函數進行事件處理,否則該事件將被過濾銷毀掉;
如果一個鼠標事件傳遞給鼠標指針所在的窗口,而該窗口的QT::WA_NoMousePropagation位置為TRUE,則該事件不會通過父窗口繼續向上傳遞。
可以通過函數pos()、x()、y()得知鼠標事件發生時鼠標指針相對於窗口的位置。
如果把移動窗口作為一次鼠標事件,可以通過函數globalPos()返回的全局坐標值避免窗口的抖動。
可以使用QWidget::setEndabled()來開啟/關閉對應的窗口是否接受鍵盤和鼠標事件。
需要對鼠標事件進行處理時,通常要重新實現以下幾個鼠標事件處理函數:
QWidget::mousePressEvent()
QWidget::mouseReleaseEvent()
QWidget::mouseDoubleClickEvent()
QWidget::mouseMoveEvent()
三、鼠標事件
鼠標事件使用的時候,加頭文件
#include <QMouseEvent>
1.鼠標按下事件
void Widget::mousePressEvent(QMouseEvent *event) { // 如果是鼠標左鍵按下 if(event->button() == Qt::LeftButton) { ··· } // 如果是鼠標右鍵按下 else if(event->button() == Qt::RightButton) { ··· } }
2.鼠標移動事件 默認情況下,觸發事件需要點擊一下,才能觸發。可設置為自動觸發:setMouseTracking(true);
void Widget::mouseMoveEvent(QMouseEvent *event) { // 這里必須使用buttons() if(event->buttons() & Qt::LeftButton) //進行的按位與 { ··· } }
3.鼠標釋放事件
void Widget::mouseReleaseEvent(QMouseEvent *event) { ··· }
4.鼠標雙擊事件
void Widget::mouseDoubleClickEvent(QMouseEvent *event) { // 如果是鼠標左鍵按下 if(event->button() == Qt::LeftButton){ ··· } }
5.滾輪事件
void Widget::wheelEvent(QWheelEvent *event) { if(event->delta() > 0)// 當滾輪遠離使用者時 { ··· } else//當滾輪向使用者方向旋轉時 { ··· } }
四、鍵盤事件
鍵盤事件使用時,加頭文件
#include <QKeyEvent>
1.鍵盤按下事件
void Widget::keyPressEvent(QKeyEvent *event) { // 是否按下Ctrl鍵 特殊按鍵 if(event->modifiers() == Qt::ControlModifier) { // 是否按下M鍵 普通按鍵 類似 if(event->key() == Qt::Key_M) ··· } else QWidget::keyPressEvent(event); //保存默認事件 //如果是處理兩個普通按鍵,得避免自動重復,釋放中也要處理 if(event->key() == Qt::Key_Up) { // 按鍵重復時不做處理 if(event->isAutoRepeat()) return; // 標記向上方向鍵已經按下 keyUp = true; } else if(event->key() == Qt::Key_Left) { if(event->isAutoRepeat()) return; keyLeft = true; } }
2.按鍵釋放事件
void Widget::keyReleaseEvent(QKeyEvent *event) { ··· //如果是處理兩個普通按鍵,得避免自動重復 if(event->key() == Qt::Key_Up) { if(event->isAutoRepeat()) return; ··· } else if(event->key() == Qt::Key_Left) { if(event->isAutoRepeat()) return; ··· } }
五、常用公有成員函數
1.globalPos()、globalX()、globalY()這三個函數返回的是鼠標指針的全局坐標。
const QPoint & QMouseEvent::globalPos () const
返回鼠標指針的全局坐標值,對於異步窗口系統例如X11這是一個很重要的特性,無論何時移動窗口作為對鼠標事件的響應時,globalPos()返回的當前鼠標指針坐標值和QCursor::pos()的返回值是有區別的,可以通過調用QWidget::mapToGlobal(pos())在窗口坐標和全局坐標系之間進行轉換。
int QMouseEvent::globalX () const
返回鼠標事件發生時鼠標指針全局坐標的X值,相當於globalPos.x();
int QMouseEvent::globalY () const
返回鼠標事件發生時鼠標指針全局坐標的Y值,相當於globalPos.y()。
2.pos()、posF()、x()、y()這四個函數返回的是鼠標指針在當前接收鼠標事件的窗口中的位置。
const QPoint & QMouseEvent::pos () const
返回鼠標指針和接受該鼠標事件窗口的相對位置,其中的坐標值為整型;
QPointF QMouseEvent::posF () const
返回鼠標指針在接受該鼠標事件窗口的相對位置,該坐標值用float類型表示可以增加精確度;
int QMouseEvent::x () const
返回鼠標事件發生時,鼠標指針在當前接收鼠標事件的窗口中位置的x坐標值,相當與pos().x();
int QMouseEvent::y () const
返回鼠標事件發生時,鼠標指針在當前接收鼠標事件的窗口中位置的y坐標值,相當於pos().y()。