7

最近,我希望QPushButton鼠标指针进入时可以发出信号。我怎样才能做到?

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

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

4

5 回答 5

11

您可以为此使用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()) );
于 2012-02-13T13:26:07.617 回答
11

虽然@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);
    ...
}
于 2014-05-23T18:31:47.673 回答
3

确保在 public 关键字后添加 ':'

public: Q_SIGNALS:
    void hovered();
于 2013-09-09T13:31:19.697 回答
1

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

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

于 2012-02-13T13:25:30.107 回答
1

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

那么你要做的就是:创建一个从 QPushButton 派生的新类,并覆盖 QPushButton 从 QWidget 继承的受保护方法“enterEvent”。

创建新类:
QT Creator - File - New File or Project...
File and Classes - C++
C++ Class
Choose...
Base class - Custom - 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

}
于 2020-11-19T23:24:22.960 回答