1

I would like to emit a signal when hovering a QLabel with the mouse in QT.

Is it possible ?

If not, how can I do it ?

Thanks.

iAmoric
  • 1,787
  • 3
  • 31
  • 64

2 Answers2

0

You can do hover handling without subclassing of QLabel. Try next code sample for it:

void LabelHoverHandler::attach(QLabel *label)
{
    label->setAttribute(Qt::WA_Hover, true);
    label->installEventFilter(this);
}

bool LabelHoverHandler::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::HoverEnter)
    {
        emit signalMouseHover(dynamic_cast<QLabel*>(obj) );
        qDebug() << "HoverEnter";
    }

    return false;
}

LabelHoverHandler header file:

class LabelHoverHandler : public QObject
{
    Q_OBJECT
public:
    LabelHoverHandler(QObject *parent);
    virtual ~LabelHoverHandler() {};

    void attach(QLabel *label);

protected:
    bool eventFilter(QObject *obj, QEvent *event);

signals:
    void signalMouseHover(QLabel*);
};

Simply create an instance of LabelHoverHandler and call method attach() with a needed label as a parameter.

ramzes2
  • 773
  • 5
  • 13
0

A possible implementation:

// mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT

public:
    MyLabel();
    ~MyLabel();

protected:
    virtual void enterEvent(QEvent *ev);
    virtual void leaveEvent(QEvent *ev);

private:
    bool hover;

};

#endif // MYLABEL_H

and:

// mylabel.cpp
#include "mylabel.h"
#include <QEvent>

MyLabel::MyLabel()
{
    hover = false;
    setAttribute(Qt::WA_Hover, true);
}

MyLabel::~MyLabel()
{    
}

void MyLabel::enterEvent(QEvent *ev)
{
    if (!hover){
        hover = true;
        setText("Send signal here");
    }
    QLabel::enterEvent(ev);
}

void MyLabel::leaveEvent(QEvent *ev)
{
    if (hover){
        hover = false;
        setText("Mouse leave area");
    }
    QLabel::leaveEvent(ev);
}
thibsc
  • 3,747
  • 2
  • 18
  • 38