DoubleClick on QLabel

DoubleClick on QLabel

本文关键字:QLabel on DoubleClick      更新时间:2023-10-16

为了解决我的问题,我已经阅读了QGrapnhicsScene上的《如何区分mouseReleaseEvent和mousedoubleClickEvent》以及Qt中的《区分单次和双击事件》。但它们不起作用。我创建了一个类QLabel:

鼠标标签.h

#ifndef MOUSELABEL_H
#define MOUSELABEL_H
#include <QLabel>
#include <QMouseEvent>
#include <QEvent>
#include <QDebug>

class MouseLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MouseLabel(QWidget *parent = 0);
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void leaveEvent(QMouseEvent *);
    int x, y;
signals:
    void Mouse_Pressed();
    void Mouse_Position();
    void Mouse_Left();
    void Mouse_Release();
    void Mouse_DoubleClick();
public slots:
};
#endif // MOUSELABEL_H

鼠标标签.cpp

#include "mouselabel.h"
MouseLabel::MouseLabel(QWidget *parent) :
    QLabel(parent)
{
}

void MouseLabel::mouseMoveEvent(QMouseEvent *event) {
    this->x = event->x();
    this->y = event->y();
    emit Mouse_Position();
}
void MouseLabel::mousePressEvent(QMouseEvent *event)
{
    emit Mouse_Pressed();
}
void MouseLabel::mouseReleaseEvent(QMouseEvent *event)
{
    emit Mouse_Release();
}
void MouseLabel::mouseDoubleClickEvent(QMouseEvent *event)
{
    emit Mouse_DoubleClick();
}
void MouseLabel::leaveEvent(QMouseEvent *)
{
    emit Mouse_Left();
}

如两个链接中所述,为了区分单击和双击,我创建了一个计时器,当鼠标释放事件发生时,计时器开始,当鼠标双击时,计时器停止。但是,这是行不通的。你能帮我解决这个问题吗?

最简单的解决方案是使用QBasicTimer,只需重载这两个方法,并在小部件中设置计时器:

  void mouseReleaseEvent(QMouseEvent *) {
    if (timer.isActive()) {
        timer.stop();
        qDebug() << "double click";
      }
    else {
        timer.start(300, this);
      }
  }
  void timerEvent(QTimerEvent *) {
    timer.stop();
    qDebug() << "single click";
  }
  QBasicTimer timer;

缺点是计时器方法会延迟单击,这有点烦人,但您可以屏蔽它,例如,在选择对象时,使用mousePressEvent进行即时响应。