DoubleClick on QLabel

时间:2015-03-23 22:19:30

标签: c++ qt c++11

我已阅读此How to distinguish between mouseReleaseEvent and mousedoubleClickEvent on QGrapnhicsScene和此Distinguish between single and double click events in Qt以解决我的问题。但它们不起作用。我创建了一个QLabel类:

mouselabel.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

mouselabel.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();
}

如两个链接中所述,为了区分单击和双击,我创建了一个计时器,它在鼠标释放事件发生时启动,并在双击鼠标时停止。但是,这不起作用。你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

最轻的解决方案是使用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来立即响应来掩盖,例如选择对象。