2012-02-13 2016 views
5

最近,我希望QPushButton可以在鼠标指针进入时发出信号。我怎么做到的?当鼠标悬停在QPushButton上时如何发出信号?

我知道QPushButton有一些已经定义好的信号,比如clicked(),pressed(),destory()等等。但没有信号悬停(),输入(),...

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

+0

如果你可以解释当鼠标悬停时你想要做什么,可能不需要拦截这样的事件。例如,如果想要更改按钮的外观,可以使用样式表完成此操作。 – 2012-02-13 14:37:22

+0

谢谢..我想这样做:如果有两个组件,一旦鼠标指针悬停在一个上,另一个是不可见的... – 2012-02-13 14:48:53

+1

好吧,既然你想影响一个基于鼠标与另一个按钮交互的按钮,你确实需要截获这个事件。 – 2012-02-13 14:59:40

回答

7

您可以使用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())); 
+0

,请投票,谢谢。我认为这有点令人费解,因为我只用一个这样的按钮,还有其他方法吗? – 2012-02-13 13:33:25

1

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

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

+0

必须被覆盖?感谢您帮助我... – 2012-02-13 13:36:37

+1

是的,您必须在自定义按钮类中实现onEnter()和onLeave()函数。请参阅@ Exa的代码示例答案。 PS。如果您首先发现有用的答案 – dirk 2012-02-13 13:40:50

3

确保添加 ':' 公共关键字后

public: Q_SIGNALS: 
    void hovered(); 
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); 
    ... 
} 
+0

这是一个非常好的答案。但是出于一些奇怪的原因,当我在QToolButton上应用这个逻辑时(显示一些自定义的文本弹出来悬停在它上面),该按钮变得不可见,尽管它悬停在应该显示弹出窗口的位置,并且即使光标变成了预期的指针,因为我为它设置了按钮! – SexyBeast 2015-02-21 22:37:05

+0

完美!我不想为每个想要检测悬停事件的小部件创建一个新类! – BuvinJ 2015-05-06 20:09:57

+2

@Cupidvogel我想我找到了原因。 'eventFilter'函数不是'return true',而是使用'return QWidget :: eventFilter(obj,event);'也不需要else条件。我做到了这一点,消失的按钮状态消失了。 – Volomike 2015-08-25 05:56:42

相关问题