最近,QPushButton当鼠标指针进入时,我希望能发出信号.我该怎么做?
我知道QPushButton有一些已经定义的信号,如clicked(),pressed(),destory() 等等.但没有信号如hover(),enter(),...
我看了一些关于它的信息:有人说可以用css完成.我不明白.你能给我一些建议吗?谢谢!
您可以使用QWidget :: enterEvent(QEvent*event).
您可以覆盖此事件,并在发生此事件时发送自定义信号.
首先,您必须为此窗口小部件启用鼠标跟踪(setMouseTracking(true)例如,在构造函数中).
头文件:
class my_button
{
// ...
protected:
virtual void enterEvent( QEvent* e );
public Q_SIGNALS:
void hovered();
// ...
};
Run Code Online (Sandbox Code Playgroud)
源文件:
void my_button::enterEvent( QEvent* e )
{
Q_EMIT hovered();
// don't forget to forward the event
QWidget::enterEvent( e );
}
Run Code Online (Sandbox Code Playgroud)
您使用按钮的位置:
connect( one_of_my_button, SIGNAL(hovered()), this, SLOT(do_something_when_button_hovered()) );
Run Code Online (Sandbox Code Playgroud)
虽然@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);
..
};
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
步骤2/2:在目标小部件上安装eventFilter.
LoginWindow::LoginWindow()
{
...
targetPushButton->installEventFilter(this);
...
}
Run Code Online (Sandbox Code Playgroud)