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

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

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

 1 /*
 2 * Description: 分开响应单击和双击的QPushButton
 3 * Author: 公子开明 KaiMing Prince
 4 * Detail: 默认的QPushButton,双击事件触发前会先触发单击事件,影响两个操作的分别处理
 5 * Class: DoubleClickedButton
 6 * Implement: 本类实现了QPushButton双击和单击的分别处理事件
 7 */
 8 #ifndef _DOUBLE_CLICKED_BUTTON_H__
 9 #define _DOUBLE_CLICKED_BUTTON_H__
10 #include <QPushButton>
11
12 class QTimer;
13
14 class DoubleClickedButton : public QPushButton
15 {
16     Q_OBJECT
17
18 public:
19     DoubleClickedButton(QWidget *parent=Q_NULLPTR);
20     DoubleClickedButton(const QString &text, QWidget *parent = Q_NULLPTR);
21     DoubleClickedButton(const QIcon &icon, const QString &text, QWidget *parent = Q_NULLPTR);
22
23     ~DoubleClickedButton();
24
25 protected:
26     virtual bool event(QEvent* event);
27
28 signals:
29     void singleClicked();
30     void doubleClicked();
31
32 private:
33     bool              m_bDoubleClicked;
34     QTimer*            m_single_clicked_timer;
35 };
36 #endif //_DOUBLE_CLICKED_BUTTON_H__

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

 1 #include "DoubleClickedButton.h"
 2 #include <QEvent>
 3 #include <QTimer>
 4
 5 DoubleClickedButton::DoubleClickedButton(QWidget *parent)
 6     : QPushButton(parent),
 7       m_single_clicked_timer(new QTimer(this)),
 8       m_bDoubleClicked(false)
 9 {
10     m_single_clicked_timer->setSingleShot(true);
11     connect(m_single_clicked_timer, SIGNAL(timeout()), this, SIGNAL(singleClicked()));
12 }
13
14 DoubleClickedButton::DoubleClickedButton(const QString &text, QWidget *parent)
15     : DoubleClickedButton(parent)
16 {
17     setText(text);
18 }
19
20 DoubleClickedButton::DoubleClickedButton(const QIcon &icon, const QString &text, QWidget *parent)
21     : DoubleClickedButton(text, parent)
22 {
23     setIcon(icon);
24 }
25
26 DoubleClickedButton::~DoubleClickedButton()
27 {
28 }
29
30 bool DoubleClickedButton::event(QEvent* event)
31 {
32     switch (event->type())
33     {
34     case QEvent::MouseButtonRelease:
35         m_bDoubleClicked ? m_bDoubleClicked = false//如果是第二次进入,重置状态
36             /*这里需要一个超时判断,超时还没进入MouseButtonDblClick事件才算是单击效果*/
37             : m_single_clicked_timer->start(10);//测试发现间隔时间最好不要低于10ms,否则不够两个事件的反馈间隔,如果需要延迟,可以自行修改间隔时间
38         break;
39     case QEvent::MouseButtonDblClick:
40         m_single_clicked_timer->stop();//进入双击事件停止掉定时器
41         m_bDoubleClicked = true;
42         emit doubleClicked();
43         break;
44     default:
45         break;
46     }
47
48     return QPushButton::event(event);
49 }

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

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

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

时间: 2024-10-13 15:38:43

Qt:QPushButton 单击、双击响应区分的相关文章

jsp页面单击 双击事件区分

点击事件的执行顺序: 单击(click):mousedown,mouseout,click: 双击(dblclick):mousedown,mouseout,click , mousedown,mouseout,click,dblclick: 在双击事件(dblclick),触发的两次单击事件(click)中,第一次的单击事件(click)会被屏蔽掉,但第二次不会.也就是说双击事件(dblclick)会返回一次单击事件(click)结果和一次双击事件(dblclick) 结果.而不是一次双击事件

树控件CTreeCtrl 创建与双击响应

函数功能:创建一个树控件,并实现双击节点响应事件. 响应方法:在树控件上增加双击响应事件. 代码: 1.在OnInitDialog中:   CTreeCtrl *ctreectrl = (CTreeCtrl *)GetDlgItem(IDC_TREE1);  //调用ModifyStyle方法修改数控件Sytle  ctreectrl->ModifyStyle(0,TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);  //设置树控件字体颜色  ct

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

今天小伙伴问我如何自己写一段代码检测 单击 双击 和 拖放.于是就写了这段代码O(∩_∩)O~ 代码如下: using UnityEngine; using System.Collections; public class Test2 : MonoBehaviour { public float oneTime; //检测双击的有效时间 private int downCount; //判断是单击还是双击 private bool currentCheck; //当前正在检测 private b

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

QTreeWidget是实现树形结构的类,在很多软件中都可以看到类似树形结构的界面. 我做的一个示例如下图,用来处理图像,最顶层节点是图像的路径名,子节点是图像的各个波段,双击各个波段会显示图像各波段的灰度图像,同时还有删除指定节点(父节点和子节点同时删除)的功能.效果如下所示 要完成这样的功能需要注意一下几点: ①.在内存中保存各个节点,当然要在堆上分配内存,删除节点时,除了去除QtreeWidget控件上的节点外,还要讲存储在内存中的节点也要删除,否则会出现内存泄露的问题. ②.节点双击的事

KendoUI Grid 绑定单击双击事件

原文:http://blog.csdn.net/sakuya_tan/article/details/51437857 <div id="grid"></div> <script> var grid = $("#grid").kendoGrid({ columns: [ { field: "id" }, { field: "name" } ], dataSource: [ { id: &qu

实现对view的单击双击监听

这里只介绍使用方法: 1.实现一个GestureDetector监听器 2.设置setOnDoubleTapListener监听 3.实现onDoubleTap(执行双击操作) 4.实现onSingleTapConfirmed(执行单击操作) // 手势监听器 GestureDetector  mGestureDetector = new GestureDetector(imageView.getContext(), new GestureDetector.SimpleOnGestureList

单击双击放大图片

-(void)create{ _scrollerView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, YHScreemW, YHScreemH)]; _scrollerView.showsVerticalScrollIndicator = NO; _scrollerView.showsHorizontalScrollIndicator = NO; _scrollerView.minimumZoomScale = 1.0; _scro

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

对于触摸屏,其原生的消息无非按下.抬起.移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理.不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了. 基础 GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手

jquery鼠标 左键-中键-右键 实现 单击-双击-拖拽-滚动 原型

javascript:<script type="text/javascript" src="jquery-1.8.3.min.js"></script><script type="text/javascript">$(function () {    var changeName = $("#result");           // 滚动监听初始化    // Mozilla的基于DO