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

定义了一个控件,继承自QWidget,但是在使用鼠标单击和双击事件的时候,出现了问题:

#pragma once

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

//用户自定义按钮

class UserButton : public QWidget {
	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;//响应鼠标单击事件
	void mouseDoubleClickEvent(QMouseEvent*)override;//响应鼠标双击事件
private:
	Ui::UserButton ui;
};

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

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

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) {
		qDebug() << "mousePressEvent";
	}
}

void UserButton::mouseDoubleClickEvent(QMouseEvent*e) {
	if (e->button() & Qt::LeftButton) {
		qDebug() << "mouseDoubleClickEvent";
	}
}

单击控件的时候,输出:

mousePressEvent

单击鼠标左键的时候,程序还是可以正确的响应的。
但是双击控件的时候输出:

mousePressEvent
mouseDoubleClickEvent

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

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

#pragma once

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

//用户自定义按钮

class QTimer;

class UserButton : public QWidget {
	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

鼠标单击按钮,输出:

"鼠标左键点击了一次"

鼠标双击按钮,输出:

"鼠标左键点击了两次"

这样就达到了,我们的要求!

aaa

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值