当鼠标悬停在QPushButton上时,如何从QPushButton发出信号?

Mr.*_*.Tu 6 qt mousehover

最近,QPushButton当鼠标指针进入时,我希望能发出信号.我该怎么做?

我知道QPushButton有一些已经定义的信号,如clicked(),pressed(),destory() 等等.但没有信号如hover(),enter(),...

我看了一些关于它的信息:有人说可以用css完成.我不明白.你能给我一些建议吗?谢谢!

Exa*_*Exa 8

您可以使用QWidget :: enterEvent(QEvent*event).

您可以覆盖此事件,并在发生此事件时发送自定义信号.

首先,您必须为此窗口小部件启用鼠标跟踪(setMouseTracking(true)例如,在构造函数中).

头文件:

class my_button
{
    // ...

protected:
    virtual void enterEvent( QEvent* e );

public Q_SIGNALS:
    void hovered();

    // ...
};
Run Code Online (Sandbox Code Playgroud)

源文件:

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

    // don't forget to forward the event
    QWidget::enterEvent( e );
}
Run Code Online (Sandbox Code Playgroud)

您使用按钮的位置:

connect( one_of_my_button, SIGNAL(hovered()), this, SLOT(do_something_when_button_hovered()) );
Run Code Online (Sandbox Code Playgroud)


Ema*_*res 7

虽然@Exa已回答了这个问题,但我想展示另一个不需要子类QPushButton的解决方案,并且使用灵活!(这就是我在项目中需要的)

步骤1/2:覆盖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);
..
};
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤2/2:在目标小部件上安装eventFilter.

LoginWindow::LoginWindow()
{
    ...
    targetPushButton->installEventFilter(this);
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @Cupidvogel我想我找到了原因.而不是`eventFilter`函数中的`return true`,使用`return QWidget :: eventFilter(obj,event);`而且一个也不需要else条件.我做了这个,消失的按钮状态消失了. (2认同)