天天看點

學習QT之事件處理

文章目錄

  • ​​一、滑鼠事件​​
  • ​​二、鍵盤事件​​
  • ​​三、事件過濾​​

一、滑鼠事件

滑鼠事件包括滑鼠的移動,滑鼠鍵按下、松開、單擊、輕按兩下和滾輪事件等。

在實際使用中,隻需重定義QWidget的三個滑鼠事件方法,即​​

​mouseMoveEvent​

​​、​

​mousePressEvent​

​​、​

​mouseReleaseEvent​

​​、​

​mouseDoubleClickEvent​

​​和​

​wheelEvent(QWheelEvent *event)​

void MouseEvent::mousePressEvent(QMouseEvent *e)
{
  if(e->button() == Qt::LeftButton)
  {
    //按下了滑鼠左鍵
  }
  else if(e->button() == Qt::RightButton)
  {
    //按下了滑鼠右鍵
  }
  else if(e->button() == Qt::MidButton)
  {
    //按下了滑鼠中鍵
  }
}

void MouseEvent::mouseMoveEvent(QMouseEvent *e)
{
  
}

void MouseEvent::mouseReleaseEvent(QMouseEvent *e)
{

}

void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e)
{

}

void MouseEvent::wheelEvent(QWheelEvent *event)
{
  if(event->dalta() > 0)
  {
    //滾輪往前滾動
  }
  else
  {
    //滾輪往後滾動
  }
}      

二、鍵盤事件

鍵盤事件的擷取是通過重定義QWidget類的​

​keyPressEvent()​

​​和​

​keyReleaseEvent()​

​來實作的。

void KeyEvent::keyPressEvent(QKeyEvent *event)
{
  //對Ctrl鍵按下的處理
  if(event->modifiers()==Qt::ControlModifier)  //a
  {
    if(event->key()==Qt::Key_Left)
    {
    
    }
    if(event->key()==Qt::Key_Right)
    {
    
    }
    if(event->key()==Qt::Key_Up)
    {
    
    }
    if(event->key()==Qt::Key_Down)
    {
    
    }
  }
  else  //對Ctrl鍵沒有按下的處理
  {
  
  }

}      

(a) if(event->modifiers()==Qt::ControlModifier):判斷修飾鍵Ctrl是否按下。Qt::KeyboardModifier定義了一系列修飾鍵,如下所示:

修飾鍵 說明
Qt::NoModifier 沒有修飾鍵按下
Qt::ShiftModifier Shift鍵按下
Qt::ControlModifier Ctrl鍵按下
Qt::AltModifier Alt鍵按下
Qt::MetaModifier Meta鍵按下
Qt::KeypadModifier 小鍵盤按鍵按下
Qt::GroupSwitchModifier Mode switch鍵按下

三、事件過濾

Qt的事件模型中提供的事件過濾功能使得一個QObject對象可以監視另一個QObject對象中的事件,通過在一個QObject對象中安裝事件過濾器,可以在事件到達該對象前捕獲事件,進而起到監視該對象事件的作用。

步驟:

1、為對象安裝事件過濾器

label1->installEventFilter(this);
label2->installEventFilter(this);
label3->installEventFilter(this);      
bool eventFilter(QObject *watched,QEvent *event)
{
  if(watched==label1)
  {
    if(event->type()==QEvent::MouseButtonPress)
    {
      //将事件event轉化為滑鼠事件
      QMouseEvent *mouseEvent=(QMouseEvent *)event;
    }  
    
    if(mouseEvent->buttons() & Qt::LeftButton)  //滑鼠點選事件
    {
      
    }  
    else if(mouseEvent->buttons() & Qt::RightButton)
    {
    
    }
    else if(mouseEvent->buttons() & Qt::MidButton)
    {
    
    }

    if(mouseEvent->type()==QEvent::MouseButtonRelease) //滑鼠釋放事件
    {
      
    }  
  }
  else if(watched==label2)
  {

  }
  else if(watched==label3)
  {

  }
}      

繼續閱讀