Qt: QPushButton 单击、双击响应区分 (****) 定时器

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

Qt 默认代码,无法区分 单击、双击

典型代码举例 (***)

解决方法:使用定时器。

-------------------------------------------------------

eventFilter(QObject *obj, QEvent *event) :同样也无法区分  单击、双击

//注意:slot 函数的不同,它们只是摘录自不同的例子 而已。

//Qt5 写法 1

connect(cTimer, &QTimer::timeout, this, &Thread::timeoutSlot);

================================

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

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

https://www.cnblogs.com/KaiMing-Prince/p/7601681.html

Qt 自定义QWidget中区分鼠标单击和双击

这就说明双击鼠标左键的时候,首先响应了鼠标左键的单击事件,然后再相应双击事件,但是我们希望鼠标左键双击的时候不要相应单击事件,而是直接相应双击事件即可。

解决办法:
可以定义一个定时器,单击鼠标左键的时候,第一次启动定时器,在300毫秒内,没有第二次单次鼠标左键,我们就认为是这是一个单击事件,否则就是双击事件。

修改之后的代码如下:

#pragma once

#include <QWidget>
#include "ui_UserButton.h"


// ****** 这里有 2个 clase *******************

//用户自定义按钮

class QTimer;  // clase 1 ***************

class UserButton : public QWidget {  // clase 2 ***************
	Q_OBJECT

public:
	UserButton(QWidget *parent = Q_NULLPTR);
	~UserButton();

private:
	QSize sizeHint()const override;
	QSize minimumSizeHint() const override;

	void paintEvent(QPaintEvent *)override;

	void mousePressEvent(QMouseEvent *)override;
#if 0
	//这部分代码不在需要
	void mouseDoubleClickEvent(QMouseEvent*)override;
#endif
private:
	Ui::UserButton ui;

private slots:
	void slotClickTime();

private:
	QTimer* _clickTimer = nullptr;//使用定时器来判断鼠标单击还是双击 
	int _clickCount = 0;//点击次数
};

#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
#include <QTimer>
#include "UserButton.h"

UserButton::UserButton(QWidget *parent)
	: QWidget(parent) {

	_clickTimer = new QTimer; // *********
	connect(_clickTimer, SIGNAL(timeout()), this, SLOT(slotClickTime()));
}

UserButton::~UserButton() {
}

QSize UserButton::sizeHint() const {
	return QSize(120, 30);
}

QSize UserButton::minimumSizeHint() const {
	return QSize(120, 30);
}

void UserButton::paintEvent(QPaintEvent *) {
	//绘制准备工作,启用反锯齿
	QPainter painter(this);
	painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

	painter.save();
	painter.setPen(Qt::NoPen);
	painter.setBrush(Qt::darkGray);
	painter.drawRoundedRect(0, 0, width(), height(), 5.0, 5.0);
	painter.restore();
}

void UserButton::mousePressEvent(QMouseEvent *e) {
	if (e->button() & Qt::LeftButton) {
		if (!_clickTimer->isActive()) {
			_clickTimer->start(300);
			_clickCount++;
		} else {
			_clickCount++;
		}
	}
}

void UserButton::slotClickTime() {
	_clickTimer->stop();
	if (_clickCount == 1) {//只点击了一次
		qDebug() << QStringLiteral("鼠标左键点击了一次");
	} else if (_clickCount == 2) {//双击鼠标
		qDebug() << QStringLiteral("鼠标左键点击了两次");
	}
	_clickCount = 0;
}

#if 0
//鼠标双击事件代码不在需要
void UserButton::mouseDoubleClickEvent(QMouseEvent*e) {
	if (e->button() & Qt::LeftButton) {
		qDebug() << "mouseDoubleClickEvent";
	}
}
#endif

典型代码举例: (***)

// .h

#include <QTimer>

class QTimer;

          

private:
    QTimer* _clickTimer = nullptr;  //使用定时器来判断鼠标单击还是双击
    int _clickCount = 0;  //点击次数

_clickTimer = new QTimer; //

                 

/Qt4 写法

    _clickTimer = new QTimer; 
    connect(_clickTimer, SIGNAL(timeout()), this, SLOT(slotClickTime()));

           

//Qt5 写法 1

connect(cTimer, &QTimer::timeout, this, &Thread::timeoutSlot);

//注意:slot 函数的不同,它们只是摘录自不同的例子 而已。

                  

//Qt5 写法 2

#include <QDebug>
#include <QTimer>
QTimer::singleShot(1000, this, [=](){
qDebug()<<"qtimer timeout after 1s";
});

void UserButton::mousePressEvent(QMouseEvent *e) {
    if (e->button() & Qt::LeftButton)

      {
        if (!_clickTimer->isActive()) {
            _clickTimer->start(300);  // 300ms
            _clickCount++;
        }

        else {
            _clickCount++;
        }

    }
}

// slot

void UserButton::slotClickTime() {
    _clickTimer->stop();   // 停止计数
    if (_clickCount == 1) { //只点击了一次
        qDebug() << QStringLiteral("鼠标左键点击了一次");
    } else if (_clickCount == 2) { //双击鼠标
        qDebug() << QStringLiteral("鼠标左键点击了两次");
    }
    _clickCount = 0;  // 复位计数
}


————————————————
版权声明:本文为CSDN博主「wb175208」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wb175208/article/details/115320440

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值