云天天的专栏

时间都去哪了?记下每一步。

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实现代码
	}
}


阅读更多
个人分类: C++
上一篇#pragma pack() 引发的问题
下一篇支持GPT的vmware-mount.exe
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭