功能介绍

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信号。

未处理Click逻辑.gif

通过分析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);
    }
}

最终的效果:

正确长按.gif