Qt实现一个响应长按的按钮
功能介绍
Qt的按钮只实现了单次点击的效果,按住鼠标点击是实现了repeat发送的效果。但是工控场景中有很多需要用户长按才会触发的功能,因此总结归纳了这个组件。
具体代码参见Github
组件实现的功能:
- 短按时发送
clicked
信号 - 长按时发送
longPressed
信号 - 无论长短按都发送
released()
信号 - 自定义长按阈值
具体实现
实现思路
实现思路简单来说就是重写鼠标事件的响应函数,增加一个定时器来判断是否达到长按阈值,代码如下:
void LongPressButton::mousePressEvent(QMouseEvent *ev)
{
mLongPressTimer.start();
QPushButton::mousePressEvent(ev);
}
void LongPressButton::mouseReleaseEvent(QMouseEvent *ev)
{
if (mLongPressTimer.isActive()) {
mLongPressTimer.stop();
}
QPushButton::mouseReleaseEvent(ev);
}
演示效果如图,但是长按后松开按钮还是会发送clicked
信号。
通过分析QPushButton
源码发现,clicked
这个信号是在QPushButton::mouseReleaseEvent
中发出的,因此我们在长按起效的情况下,把信号屏蔽即可达到效果。但是需要自己补发一个released
信号。
void LongPressButton::mouseReleaseEvent(QMouseEvent *ev)
{
if (mLongPressTimer.isActive()) {
mLongPressTimer.stop();
QPushButton::mouseReleaseEvent(ev);
} else {
Q_EMIT released();
blockSignals(true);
QPushButton::mouseReleaseEvent(ev);
blockSignals(false);
}
}
最终的效果:
感谢扫码支持