一、鼠標事件
鼠標事件包括鼠標的移動,鼠標鍵按下、鬆開、單擊、雙擊和滾輪事件等。
在實際使用中,只需重定義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);
QObject的remoeEventFilter()
函數可以解除以安裝的事件過濾器。
2、重寫QObject的事件監視函數
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)
{
}
}