开发环境: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 <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__

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

 #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();//测试发现间隔时间最好不要低于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 单击、双击响应区分的更多相关文章

  1. Unity 代码检测单击,双击,拖放

    今天小伙伴问我如何自己写一段代码检测 单击 双击 和 拖放.于是就写了这段代码O(∩_∩)O~ 代码如下: using UnityEngine; using System.Collections; p ...

  2. iOS 开源一个高度可定制支持各种动画效果,支持单击双击,小红点,支持自定义不规则按钮的tabbar

    TYTabbarAnimationDemo 业务需求导致需要做一个tabbar,里面的按钮点击带有动画效果,tabbar中间的按钮凸出,凸出部分可以点击,支持badge 小红点等,为此封装了一个高度可 ...

  3. MVC中使用Echart后台加载数据 实现饼图、折线图、全国地图数据,单击双击事件等

    @{ Layout = null; } @if (false) { <script src="~/Js/jquery-easyui-1.5/jquery.min.js"> ...

  4. iOS touch事件单击双击区分响应

    如果您的 iPhone 应用里有个 view,既有单击操作又有双击操作.用户双击 view 时,总是先执行一遍单击的操作再执行双击的操作.所以直接判断时就会发现不能直接进入双击操作.下面是区分 tou ...

  5. Qt QTreeWidget节点的添加+双击响应+删除详解(转)

    QTreeWidget是实现树形结构的类,在很多软件中都可以看到类似树形结构的界面. 我做的一个示例如下图,用来处理图像,最顶层节点是图像的路径名,子节点是图像的各个波段,双击各个波段会显示图像各波段 ...

  6. Qt QTreeWidget节点的添加+双击响应+删除详解

    转自: http://www.cnblogs.com/Romi/archive/2012/08/08/2628163.html 承接该文http://www.cnblogs.com/Romi/arch ...

  7. JS 区分单击双击

    var timeout =null; $("#Btn").on("click",function(){ clearTimeout(timeout);//停止单击 ...

  8. Android手势识别(单击 双击 抬起 短按 长按 滚动 滑动)

    对于触摸屏,其原生的消息无非按下.抬起.移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理.不过,为了提高我们的APP的用户体验,有时候我们 ...

  9. Ubuntu18系统qt生成程序无法双击运行问题

    1.Ubuntu18 安装qt编译生成的程序文件类型为application/x-sharedlib,无法双击直接运行.文件类型应该为x-executable. 2.解决方法 在.pro文件中添加下面 ...

随机推荐

  1. CentOS运维常用管理操作命令

    自己整理的整理Linux常用运维和linux常用管理操作命令,当然不是非常详细和丰富,但是也基本上够用了吧.欢迎留言补充更多的Linux常用运维和linux常用管理操作命令.不断完善中.... 备份m ...

  2. 深入浅出Redis-redis哨兵集群[转]

    1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...

  3. MySQL 日期与时间的处理

    1.查询当前日期时间:函数有now(),localtime(),current_timestamp(),sysdate(). mysql> select now(),localtime(),cu ...

  4. c++ word类型

    word就是16位的数据 随着机器的发展,C++语言本身并没有规定short的位数,不一定是十六位的(随着计算机的发展,可能改变).但word将永远是16位的--机器发展后只需要修改,typedef ...

  5. jquery的委托处理

     1.基本用法: javascript的事件模型,采用”冒泡”模式,也就是说,子元素的事件会逐级向上”冒泡”,成为父元素的事件. 利用这一点,可以大大简化事件的绑定.比如,有一个表格(table元素) ...

  6. 【zookeeper】 zookeeper 集群搭建

    集群搭建环境: 发行版:CentOS-6.6 64bit 内核:2.6.32-504.el6.x86_64 CPU:intel-i7 3.6G 内存:2G 集群搭建步骤: 1. 确保机器安装了jdk ...

  7. Swift coreAnimation 加计时器写的游戏《飞机大战》

    近期在学习swift的动画和图层.就用现学的东西写了个游戏,基本思想 基本功能都实现了.图片都是在网上找得.希望能帮助大家更好的理解动画和图层. 声明下,我是刚開始学习的人,代码写的不好.大家应该都能 ...

  8. 面向对象----构造方法、this 关键字、函数的参数传递、package语句/import语句

    构造方法 构造器的定义.作用 构造方法的特征 它具有与类相同的名称:它不含返回值: 注意:在构造方法里不含返回值的概念是不同于“void”的,在定义构造方法时加了“void”,结果这个方法就不再被自动 ...

  9. iOS开发:iOS中图片与视频一次性多选 - v2m

    一.使用系统的Assets Library Framework这个是用来访问Photos程序中的图片和视频的库.其中几个类解释如下 ALAsset ->包含一个图片或视频的各种信息 ALAsse ...

  10. (三)微信小程序之发送服务通知(模板消息)

    1.后端获取AccessToken返回给微信端 微信小程序端请求后端得到AccessToken   2.后端获取openid返回给微信端   微信小程序端登录请求后端得到openid   3.发送消息 ...