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

时间:2012-02-13 13:14:20

标签: qt mousehover

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

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

这样的信号

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

5 个答案:

答案 0 :(得分:8)

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

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

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

标题文件:

class my_button
{
    // ...

protected:
    virtual void enterEvent( QEvent* e );

public Q_SIGNALS:
    void hovered();

    // ...
};

源文件:

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

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

您使用按钮的位置:

connect( one_of_my_button, SIGNAL(hovered()), this, SLOT(do_something_when_button_hovered()) );

答案 1 :(得分:6)

虽然@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);
..
};

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);
    }
}

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

LoginWindow::LoginWindow()
{
    ...
    targetPushButton->installEventFilter(this);
    ...
}

答案 2 :(得分:3)

确保在public关键字

之后添加“:”
public: Q_SIGNALS:
    void hovered();

答案 3 :(得分:1)

如果我没记错,您需要为按钮(Qt documentation)启用鼠标跟踪并覆盖QWidget::onEnter()QWidget::onLeave()

您需要创建一个继承自QPushButton的自定义按钮类。您可以在自定义类中为mouseEnter和mouseLeave定义信号,并从需要覆盖的onEnter()onLeave()方法中发出它们。

答案 4 :(得分:1)

因此,QT使用“事件” enterEvent处理鼠标悬停(https://doc.qt.io/qt-5/qevent.html查找“ QEvent :: Enter”)。这与信号/插槽功能(https://doc.qt.io/qt-5/signalsandslots.html)无关,而与事件(https://doc.qt.io/qt-5/eventsandfilters.html)有关 我们在QWidget类(https://doc.qt.io/qt-5/qwidget.html)上发现enterEvent作为受保护的方法,该类是QPushButton类(https://doc.qt.io/qt-5/qpushbutton.html)的基类。

所以您要做的是:创建一个从QPushButton派生的新类,并重写QPushButton从QWidget继承的受保护方法“ enterEvent”。

创建新类:
QT Creator-文件-新文件或项目...
文件和类-C ++
C ++类
选择...
基类-自定义-QPushButton
下一个
为新类定义名称,例如MyPushButton

在mypushbutton.h中:

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H

#include <QPushButton>

class MyPushButton: public QPushButton
{
    Q_OBJECT
public:
    using QPushButton::QPushButton;  //inherits the QPushButton constructors

signals:
    void myPushButtonMouseHover();

protected:
    void enterEvent(QEvent *event);
};

#endif // MYPUSHBUTTON_H

在mypushbutton.cpp中:

#include "mypushbutton.h"
#include <QMessageBox>

void MyPushButton::enterEvent(QEvent *event)
{
    QMessageBox::warning(this, "Mouse hover", "Mouse hovered MyPushButton"); //popping a message box

    emit myPushButtonMouseHover();  //emitting signal 

    QPushButton::QWidget::enterEvent(event);  //calling the "natural" enterEvent

}