最近,我想让 QPushButton
在鼠标指针进入时发射一个信号。我该怎么办?
我知道 QPushButton 已经有一些预定义的信号,例如 clicked()
, pressed()
, destroy()
等等。但是没有像 hover()、enter() 这样的信号。
我查看了一些相关信息:有人说这可以通过 CSS 完成。但我不理解。你能给我一些建议吗?谢谢!
最近,我想让 QPushButton
在鼠标指针进入时发射一个信号。我该怎么办?
我知道 QPushButton 已经有一些预定义的信号,例如 clicked()
, pressed()
, destroy()
等等。但是没有像 hover()、enter() 这样的信号。
我查看了一些相关信息:有人说这可以通过 CSS 完成。但我不理解。你能给我一些建议吗?谢谢!
虽然@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你可以使用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()) );
public: Q_SIGNALS:
void hovered();
如果我没记错的话,您需要为按钮启用鼠标跟踪(Qt文档),并重写QWidget::onEnter()
和QWidget::onLeave()
方法。
您需要创建一个自定义按钮类,继承自QPushButton。您可以在自定义类中定义mouseEnter和mouseLeave信号,并从您需要重写的onEnter()
和onLeave()
方法中发出它们。
创建新类:
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
#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
}