Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to emit a signal from a QPushButton when the mouse hovers over it?

Tags:

qt

mousehover

Recently, I wanted that QPushButton can emit a signal, when the mouse pointer enters. How can I make it?

I know that QPushButton has some already defined signal, such as clicked(), pressed(), destory() and so on. But no signal like hover(), enter(), ...

I looked some information about it: Someone said it can be done by css. I don't understand. Can you give me some advice ? Thank you!

like image 357
Mr.Tu Avatar asked Feb 13 '12 13:02

Mr.Tu


2 Answers

Although @Exa has answered this question, I want to show another solution which does not need to subclass QPushButton and is flexible in use! ( That's what I need in my project)

Step 1/2 : Overriding eventFilter.

LoginWindow.h:

// LoginWindow is where you placed your QPushButton 
//(= most probably your application windows)

class LoginWindow: public QWidget
{
public:
      bool eventFilter(QObject *obj, QEvent *event);
..
};

LoginWindow.cpp:

bool LoginWindow::eventFilter(QObject *obj, QEvent *event)
{
    // This function repeatedly call for those QObjects
    // which have installed eventFilter (Step 2)

    if (obj == (QObject*)targetPushButton) {
        if (event->type() == QEvent::Enter)
        {
        // Whatever you want to do when mouse goes over targetPushButton
        }
        return true;
    }else {
        // pass the event on to the parent class
        return QWidget::eventFilter(obj, event);
    }
}

Step 2/2 : Installing eventFilter on target widgets.

LoginWindow::LoginWindow()
{
    ...
    targetPushButton->installEventFilter(this);
    ...
}
like image 115
Emadpres Avatar answered Oct 06 '22 06:10

Emadpres


You can use QWidget::enterEvent ( QEvent * event ) for this.

You override this event and send a custom defined signal when ever this event occurs.

First you have to enable mouse tracking for this widget (setMouseTracking(true) in the constructor for example).

Header file:

class my_button
{
    // ...

protected:
    virtual void enterEvent( QEvent* e );

public Q_SIGNALS:
    void hovered();

    // ...
};

Source file:

void my_button::enterEvent( QEvent* e )
{
    Q_EMIT hovered();

    // don't forget to forward the event
    QWidget::enterEvent( e );
}

Where you use your button:

connect( one_of_my_button, SIGNAL(hovered()), this, SLOT(do_something_when_button_hovered()) );
like image 23
Exa Avatar answered Oct 06 '22 07:10

Exa