天天看點

Qt事件系統:滑鼠事件和滾輪事件

作者:C加加Qt技術開發老傑

一、 QMouseEvent - 滑鼠事件

QMouseEvent 類用來表示一個滑鼠事件,當在視窗部件中按下滑鼠、釋放滑鼠和移動滑鼠指針時,都會産生滑鼠事件 QMouseEvent。利用 QMouseEvent 類可以獲知滑鼠是哪個鍵按下釋放了、滑鼠指針的目前位置等資訊。通常是重定義視窗部件的滑鼠事件處理函數來進行一些自定義的操作。

  • Qt 中的 QMouseEvent 一般隻涉及按下滑鼠、釋放滑鼠和移動滑鼠指針等操作,而對滑鼠滾輪的響應則通過 QWheeEvent 來處理。
  • 滑鼠移動事件隻會在按下滑鼠按鍵的情況下才會發生,除非通過顯式調用。
  • QWidget::setMouseTracking() 函數來開啟滑鼠軌迹,這種情況下隻要滑鼠指針在移動,就會産生一系列的 Qt 滑鼠事件。

QMouseEvent 的傳遞

多個重疊的視窗在實作裡好比一個遞歸的倒立樹,滑鼠事件會沿着滑鼠指針所在的父視窗的連結清單向上傳遞,直到某個視窗調用 accept() 函數進行事件處理,否則該事件将被過濾銷毀掉。

  • 如果想要滑鼠指針所在的父視窗不接收該事件,則可以調用函數 ignore() 予以忽略。
  • 如果一個滑鼠事件傳遞給滑鼠指針所在的視窗,而該視窗的 QT::WA_NoMousePropagation 位置為TRUE,則該事件不會通過父視窗繼續向上傳遞。
  • 可以使用 QWidget::setEnabled() 來開啟/關閉對應的視窗是否接受鍵盤和滑鼠事件。

滑鼠事件執行個體

滑鼠事件使用的時候,加頭檔案 <QMouseEvent>,然後在頭檔案中重寫這些函數:

#include <QMouseEvent>

protected:
	// 滑鼠按下事件
    void mousePressEvent(QMouseEvent * event);
    // 滑鼠釋放事件
    void mouseReleaseEvent(QMouseEvent *event);
    // 滑鼠移動事件
    void mouseMoveEvent(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();    
}

// 滑鼠釋放事件
void myMouseEvent::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左鍵釋放" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右鍵釋放" ;
    }

    // 擷取釋放時的滑鼠指針坐标
    qDebug() << "release:" << event->x() << " " << event->y();
}

// 滑鼠移動事件
void myMouseEvent::mouseMoveEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左鍵移動" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右鍵移動" ;
    }

    // 擷取移動過程中的滑鼠指針坐标
    qDebug() << "move:" << 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
左鍵釋放
release: 100   98
move: 75   81
move: 76   81    
           

還有一個滑鼠輕按兩下事件 mouseDoubleClickEvent() ,與滑鼠按下事件大同小異,這裡就不再詳細講解了。

QMouseEvent 常用成員函數

  • globalPos():傳回滑鼠指針的全局坐标值(類型為 QPoint),即相對于 PC 螢幕的坐标值,而不是相對于目前打開視窗;
  • globalX():傳回滑鼠事件發生時滑鼠指針全局坐标的 X 值;
  • globalY():傳回滑鼠事件發生時滑鼠指針全局坐标的 Y 值;
  • pos():傳回滑鼠指針和接受該滑鼠事件視窗的相對位置,其中的坐标值為整型;
  • posF():傳回滑鼠指針在接受該滑鼠事件視窗的相對位置,該坐标值用float類型表示可以增加精确度。

二、QWheelEvent - 滾輪事件

QWheelEvent 類用來表示滑鼠滾輪事件,包含用于描述滑鼠滑輪事件的相關參數。函數原型:

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的光标和字型都縮小
    }
}
           

使用者向上滑動滑鼠,則放大;而向下滑動滑鼠,則縮小。

Qt開發必備技術棧學習路線和資料