1. 程式人生 > >學習筆記21:QMouseEvent滑鼠事件簡介

學習筆記21:QMouseEvent滑鼠事件簡介

一、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()。