學習QT之事件處理

一、鼠標事件

鼠標事件包括鼠標的移動,鼠標鍵按下、鬆開、單擊、雙擊和滾輪事件等。
在實際使用中,只需重定義QWidget的三個鼠標事件方法,即mouseMoveEventmousePressEventmouseReleaseEventmouseDoubleClickEventwheelEvent(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)
	{

	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章