1. 程式人生 > >QT QPushButton點選事件的實現

QT QPushButton點選事件的實現

最近需要對按鈕實現效果:當滑鼠按下時按鈕有效果1,然後滑鼠鬆開時按鈕有效果2。

分析:這裡沒有現成的訊號可以使用,需要過載mousePressEvent 及 mouseReleaseEvent 事件函式,在mouseReleaseEvent 函式中檢查滑鼠是否在按鈕中,若是,則傳送點選事件。以下為版本一實現:

void testbutton::mousePressEvent(QMouseEvent *e)
{
	//效果1實現程式碼
}

void testbutton::mouseReleaseEvent(QMouseEvent *e)
{
	//效果2實現程式碼

	//滑鼠釋放時如果仍在按鈕內部,傳送click訊號,注意這裡e->pos返回的是相對於按鈕起始位置的位置
	if (this->bIsPointInRect(e->pos(), QRect(0, 0, this->width(), this->height())))
	{
		emit clicked();
	}
}
這樣造輪子顯然是不高效的,並且程式碼也比較醜陋,QPushButton繼承自QAbstractButton,在QAbstractButton中有更好的mousePressEvent 及 mouseReleaseEvent 實現,可以發現滑鼠點選事件的原理跟版本一是類似的。以下為版本二的實現:
void testbutton::mousePressEvent(QMouseEvent *e)
{
	QPushButton::mousePressEvent(e);
	if (e->isAccepted())
	{
		//效果1實現程式碼
	}
}

void testbutton::mouseReleaseEvent(QMouseEvent *e)
{
	QPushButton::mouseReleaseEvent(e);
	if (e->isAccepted())
	{
		//效果2實現程式碼
	}
}