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