一、 QMouseEvent的詳細描述
QMouseEvent 類用來表示一個鼠標事件,當在窗口部件中按下鼠標、釋放鼠標和移動鼠標指針時,都會產生鼠標事件 QMouseEvent。利用 QMouseEvent 類可以獲知鼠標是哪個鍵按下釋放了、鼠標指針的當前位置等信息。通常是重定義窗口部件的鼠標事件處理函數來進行一些自定義的操作。
- Qt中的QMouseEvent一般只涉及按下鼠標、釋放鼠標和移動鼠標指針等操作,而對鼠標滾輪的響應則通過QWheeEvent來處理。
- 鼠標移動事件只會在按下鼠標按鍵的情況下才會發生,除非通過顯式調用。
- QWidget::setMouseTracking()函數來開啟鼠標軌跡,這種情況下只要鼠標指針在移動,就會產生一系列的Qt鼠標事件。
二、 QMouseEvent的傳遞
多個重疊的窗口在實現里好比一個遞歸的倒立樹,鼠標事件會沿着鼠標指針所在的父窗口的鏈表向上傳遞,直到某個窗口調用accept()函數進行事件處理,否則該事件將被過濾銷毀掉。
- 如果想要鼠標指針所在的父窗口不接收該事件,則可以調用函數ignore()予以忽略。
- 如果一個鼠標事件傳遞給鼠標指針所在的窗口,而該窗口的QT::WA_NoMousePropagation位置為TRUE,則該事件不會通過父窗口繼續向上傳遞。
- 可以使用QWidget::setEnabled()來開啟/關閉對應的窗口是否接受鍵盤和鼠標事件。
三、鼠標事件實例
鼠標事件使用的時候,加頭文件:
#include <QMouseEvent>
3.1 鼠標按下事件 mousePressEvent()
mousePressEvent() 函數可以區分出鼠標按下時是左鍵還是右鍵,以及獲取鼠標按下時的坐標值等。
所以我們可以在頭文件中重寫這個函數:
protected:
//鼠標按下事件
void mousePressEvent(QMouseEvent * event);
然后就是在源文件中去實現具體的邏輯了:
//鼠標按下事件
void MainWindow::mousePressEvent(QMouseEvent * event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左鍵按下" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右鍵按下" ;
}
//獲取按下時的鼠標指針坐標
qDebug() << event->x() << ":" << event->y();
}
這樣我們就能知道你按下時是左鍵還是右鍵,以及獲取你按下時的鼠標指針坐標。運行程序,在窗口左鍵點擊一下,右鍵點擊一下,輸出如下所示:
15:49:08: Starting F:\Project\C++ Project\Qt\build-myMouseEvent-Desktop_Qt_5_9_7_MinGW_32bit-Debug\debug\myMouseEvent...
左鍵按下
press: 96 75
右鍵按下
press: 249 159
3.2 鼠標釋放事件 mouseReleaseEvent()
mousePressEvent() 函數可以區分出鼠標釋放時是左鍵還是右鍵,以及獲取鼠標釋放時的坐標值等。
所以我們可以在頭文件中重寫這個函數:
//鼠標釋放事件
void mouseReleaseEvent(QMouseEvent *event);
然后就是在源文件中去實現具體的邏輯了:
//鼠標釋放事件
void myMouseEvent::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左鍵釋放" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右鍵釋放" ;
}
//獲取釋放時的鼠標指針坐標
qDebug() << "release:" << event->x() << " " << event->y();
}
這樣我們就能知道你釋放時是左鍵還是右鍵,以及獲取你釋放時的鼠標指針坐標。運行程序,在窗口左鍵按下鼠標移動一些距離再釋放,右鍵同理,輸出如下所示:
15:50:05: Starting F:\Project\C++ Project\Qt\build-myMouseEvent-Desktop_Qt_5_9_7_MinGW_32bit-Debug\debug\myMouseEvent...
左鍵釋放
release: 100 98
右鍵釋放
release: 257 206
3.3 鼠標移動事件 mouseMoveEvent()
mouseMoveEvent() 函數默認情況下,觸發事件需要點擊一下,才能觸發。可設置為自動觸發:setMouseTracking(true)。
所以我們可以在頭文件中重寫這個函數:
//鼠標移動事件
void mouseMoveEvent(QMouseEvent *event);
然后就是在源文件中去實現具體的邏輯了:
//鼠標移動事件
void myMouseEvent::mouseMoveEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左鍵移動" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右鍵移動" ;
}
//獲取移動過程中的鼠標指針坐標
qDebug() << "move:" << event->x() << " " << event->y();
}
該函數無法區分移動的是左鍵還是右鍵。運行程序,在窗口左鍵移動鼠標,輸出如下所示:
16:07:31: Starting F:\Project\C++ Project\Qt\build-myMouseEvent-Desktop_Qt_5_9_7_MinGW_32bit-Debug\debug\myMouseEvent...
move: 75 81
move: 76 81
move: 77 81
move: 78 81
move: 79 81
還有一個鼠標雙擊事件 mouseDoubleClickEvent() ,與鼠標按下事件大同小異,這里就不再詳細講解了。
四、QMouseEvent常用成員函數
4.1 globalPos()、globalX()、globalY()
const QPoint & QMouseEvent::globalPos () const
返回鼠標指針的全局坐標值(類型為QPoint),即相對於PC屏幕的坐標值,而不是相對於當前打開窗口。
int QMouseEvent::globalX () const
返回鼠標事件發生時鼠標指針全局坐標的X值。
int QMouseEvent::globalY () const
返回鼠標事件發生時鼠標指針全局坐標的Y值。
4.2 pos()、posF()、x()、y()
const QPoint & QMouseEvent::pos () const
返回鼠標指針和接受該鼠標事件窗口的相對位置,其中的坐標值為整型。
QPointF QMouseEvent::posF () const
返回鼠標指針在接受該鼠標事件窗口的相對位置,該坐標值用float類型表示可以增加精確度。
int QMouseEvent::x () const
返回鼠標事件發生時,鼠標指針在當前接收鼠標事件的窗口中位置的x坐標值。
int QMouseEvent::y () const
返回鼠標事件發生時,鼠標指針在當前接收鼠標事件的窗口中位置的y坐標值。
五、QWheelEvent的詳細描述
QWheelEvent 類用來表示鼠標滾輪事件,包含用於描述鼠標滑輪事件的相關參數。
頭函數:#include<QWheelEvent>,繼承至:QInputEvent。
函數原型:
QWheelEvent::QWheelEvent(const QPoint &pos, int delta, Qt::MouseButtons buttons,Qt::KeyboardModifiers modifiers, Qt::Orientation orient = Qt::Vertical )
功能與參數:
/*** 創建一個wheelEvent對象, ***/
(1)參數pos代表鼠標指針在窗口中的當前位置,通常用globalPos()初始化QCursor::pos(),但並不總是正確的。如果需要顯示指定一個全局位置,可以用其他的構造函數;
(2)參數button用於描述在鼠標事件過程中鼠標按鍵的狀態(state);
(3)delta()可以返回滑動的距離,正數值表示滑輪相對於用戶在向前滑動,相反,負數值表示滑輪相對於用戶是向后滑動的。;
(4)參數modifiers用於描述在鼠標事件中鼠標狀態位改變時的參數值(比如鼠標的左中右按鍵的切換);
(5)參數orient用於指示鼠標滑輪滾動的方向(水平或者垂直)。
六、滾輪事件實例
//滾輪事件
void myMouseEvent::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0) //當滾輪向上滑,遠離使用者
{
ui->textEdit->zoomIn(); //進行放大,textEdit的光標和字體都放大
}
else //當滾輪向下滑,靠近使用者
{
ui->textEdit->zoomOut(); //進行縮小,textEdit的光標和字體都縮小
}
}
用戶向上滑動鼠標,則放大;而向下滑動鼠標,則縮小。
參考:
