点击QLabel两次

3
我已经阅读了这篇文章:如何在QGraphicsScene中区分mouseReleaseEvent和mousedoubleClickEvent 和这篇文章:在Qt中区分单击和双击事件,以解决我的问题。但它们并没有起作用。我创建了一个QLabel类:
#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
我建议您调查为什么支持的解决方案对您无效,而不是重新发明自己的解决方案。 - user2836797
1个回答

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以实现即时响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接