pushbtn单击与双击

笔记

header

#ifndef _DOUBLE_CLICKED_BUTTON_H__
#define _DOUBLE_CLICKED_BUTTON_H__
#include <QPushButton>

class QTimer;

class DoubleClickedButton : public QPushButton
{
    Q_OBJECT

public:
    DoubleClickedButton(QWidget *parent=Q_NULLPTR);
    DoubleClickedButton(const QString &text, QWidget *parent = Q_NULLPTR);
    DoubleClickedButton(const QIcon &icon, const QString &text, QWidget *parent = Q_NULLPTR);

    ~DoubleClickedButton();

protected:
    virtual bool event(QEvent* event);

signals:
    void singleClicked();
    void doubleClicked();

private:
    bool              m_bDoubleClicked;
    QTimer*            m_single_clicked_timer;
};
#endif //_DOUBLE_CLICKED_BUTTON_H__

source

#include "DoubleClickedButton.h"
#include <QEvent>
#include <QTimer>

DoubleClickedButton::DoubleClickedButton(QWidget *parent)
    : QPushButton(parent),
      m_single_clicked_timer(new QTimer(this)),
      m_bDoubleClicked(false)
{
    m_single_clicked_timer->setSingleShot(true);
    connect(m_single_clicked_timer, SIGNAL(timeout()), this, SIGNAL(singleClicked()));
}

DoubleClickedButton::DoubleClickedButton(const QString &text, QWidget *parent)
    : DoubleClickedButton(parent)
{
    setText(text);
}

DoubleClickedButton::DoubleClickedButton(const QIcon &icon, const QString &text, QWidget *parent)
    : DoubleClickedButton(text, parent)
{
    setIcon(icon);
}

DoubleClickedButton::~DoubleClickedButton()
{
}

bool DoubleClickedButton::event(QEvent* event)
{
    switch (event->type())
    {
    case QEvent::MouseButtonRelease:
        m_bDoubleClicked ? m_bDoubleClicked = false//如果是第二次进入,重置状态
            /*这里需要一个超时判断,超时还没进入MouseButtonDblClick事件才算是单击效果*/
            : m_single_clicked_timer->start(10);//测试发现间隔时间最好不要低于10ms,否则不够两个事件的反馈间隔,如果需要延迟,可以自行修改间隔时间
        break;
    case QEvent::MouseButtonDblClick:
        m_single_clicked_timer->stop();//进入双击事件停止掉定时器
        m_bDoubleClicked = true;
        emit doubleClicked();
        break;
    default:
        break;
    }

    return QPushButton::event(event);
}

定时器来延时判断单击事件,当收到单击事件是启动定时器;当定时器触发还没有第二次单击进入的时候,认为是单击事件;触发之前收到双击事件或第二次单击事件,则视为是一个双击动作。

定时器只能触发一次,否则会无限发出单击信号,这里要注意一下;在mouseRelease事件中,判断是否已经触发过doubleclick,如果触发过就不能再启动定时器了,只有第一次单击才能触发定时器,所以我们需要一个bool值判断一下是否为第二次进入单击事件。

剩下的就很简单了,双击事件直接关闭定时器,发送出双击信号,单击事件则等待定时器触发认为没有第二次点击再发出单击信号

定时器的时间在测试中发现最好不要低于10ms,至于具体doubleclick和第二次mouseRelease到底差了多少响应间隔,有兴趣的可以自己测试,或者参考qt源码看doubleclick的响应判断方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值