最近,我希望QPushButton
可以在鼠标指针进入时发出信号。我怎么做到的?当鼠标悬停在QPushButton上时如何发出信号?
我知道QPushButton有一些已经定义好的信号,比如clicked()
,pressed()
,destory()
等等。但没有信号悬停(),输入(),...
我看了一些关于它的信息:有人说可以通过CSS来完成。我不明白。你能给我一些建议吗?谢谢!
最近,我希望QPushButton
可以在鼠标指针进入时发出信号。我怎么做到的?当鼠标悬停在QPushButton上时如何发出信号?
我知道QPushButton有一些已经定义好的信号,比如clicked()
,pressed()
,destory()
等等。但没有信号悬停(),输入(),...
我看了一些关于它的信息:有人说可以通过CSS来完成。我不明白。你能给我一些建议吗?谢谢!
您可以使用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-13 13:33:25
如果我没有记错,您需要启用按钮的鼠标跟踪(Qt documentation)并覆盖QWidget::onEnter()
和QWidget::onLeave()
。
您将需要创建一个从QPushButton继承的自定义按钮类。您可以在自定义类中为mouseEnter和mouseLeave定义信号,并从您需要覆盖的方法onEnter()
和onLeave()
中发出信号。
必须被覆盖?感谢您帮助我... – 2012-02-13 13:36:37
是的,您必须在自定义按钮类中实现onEnter()和onLeave()函数。请参阅@ Exa的代码示例答案。 PS。如果您首先发现有用的答案 – dirk 2012-02-13 13:40:50
确保添加 ':' 公共关键字后
public: Q_SIGNALS:
void hovered();
尽管@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);
...
}
这是一个非常好的答案。但是出于一些奇怪的原因,当我在QToolButton上应用这个逻辑时(显示一些自定义的文本弹出来悬停在它上面),该按钮变得不可见,尽管它悬停在应该显示弹出窗口的位置,并且即使光标变成了预期的指针,因为我为它设置了按钮! – SexyBeast 2015-02-21 22:37:05
完美!我不想为每个想要检测悬停事件的小部件创建一个新类! – BuvinJ 2015-05-06 20:09:57
@Cupidvogel我想我找到了原因。 'eventFilter'函数不是'return true',而是使用'return QWidget :: eventFilter(obj,event);'也不需要else条件。我做到了这一点,消失的按钮状态消失了。 – Volomike 2015-08-25 05:56:42
如果你可以解释当鼠标悬停时你想要做什么,可能不需要拦截这样的事件。例如,如果想要更改按钮的外观,可以使用样式表完成此操作。 – 2012-02-13 14:37:22
谢谢..我想这样做:如果有两个组件,一旦鼠标指针悬停在一个上,另一个是不可见的... – 2012-02-13 14:48:53
好吧,既然你想影响一个基于鼠标与另一个按钮交互的按钮,你确实需要截获这个事件。 – 2012-02-13 14:59:40