Qt:QPushButton 单击、双击响应区分

admin 2022年10月2日07:34:40评论229 views字数 2360阅读7分52秒阅读模式

开发环境:win10+vs2015+qt5.9.1

背景:QPushButton的双击事件虽然一直有,但是在双击完成之前,总会响应到单击的事件处理或者连接槽,使用很不方便。自己子类化了一个QPushButton来区分这两种点击事件的处理

/** Description: 分开响应单击和双击的QPushButton* Author: 公子开明 KaiMing Prince* Detail: 默认的QPushButton,双击事件触发前会先触发单击事件,影响两个操作的分别处理* Class:DoubleClickedButton* Implement: 本类实现了QPushButton双击和单击的分别处理事件*/#ifndef _DOUBLE_CLICKED_BUTTON_H__#define _DOUBLE_CLICKED_BUTTON_H__#include 
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__

首先,我们需要一个定时器来延时判断单击事件,当收到单击事件是启动定时器;当定时器触发还没有第二次单击进入的时候,认为是单击事件;触发之前收到双击事件或第二次单击事件,则视为是一个双击动作,具体代码如下

#include "DoubleClickedButton.h"#include #include 
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的响应判断方式


原文始发于微信公众号(汇编语言):Qt:QPushButton 单击、双击响应区分

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月2日07:34:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Qt:QPushButton 单击、双击响应区分http://cn-sec.com/archives/1330179.html

发表评论

匿名网友 填写信息