我正在尝试在 Qt 中实现鼠标悬停效果,但我不知道如何使用事件处理程序。我创建了一个带有按钮的简单 Qt Widget 应用程序。我可以将事件处理程序绑定到 MainWindow,如下所示:
MainWindow::enterEvent(QEvent *event)
{
ui->pushButton_3->setGraphicsEffect(effect);
}
Run Code Online (Sandbox Code Playgroud)
这有效,graphicsEffect 被应用到pushButton。但我不明白如何将事件处理程序绑定到单个 QObject。据我所知,不可能使用信号,因为它们只支持单击事件,不支持鼠标悬停事件。
我对 Qt 还很陌生,我找不到任何我能理解的信息。
谁能向我解释如何将事件处理程序绑定到单个 QObject?
提前致谢。
我通过使用 QtCreator 中的“升级到...”选项以另一种方式解决了这个问题。正如这里所解释的:http://sector.ynet.sk/qt4-tutorial/customing-widgets.html
我添加了一个类“MyPushButton”:
mypushbutton.h
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include <QPushButton>
#include <QGraphicsDropShadowEffect>
class MyPushButton : public QPushButton
{
Q_OBJECT
public:
MyPushButton(QWidget *parent = 0);
private:
void enterEvent(QEvent *e);
void leaveEvent(QEvent *e);
QGraphicsDropShadowEffect *effect;
};
#endif // MYPUSHBUTTON_H
Run Code Online (Sandbox Code Playgroud)
mypushbutton.cpp
#include "mypushbutton.h"
MyPushButton::MyPushButton(QWidget *parent)
:QPushButton(parent)
{
effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(5);
effect->setEnabled(false);
this->setGraphicsEffect(effect);
}
void MyPushButton::enterEvent(QEvent *event)
{
if (this->isEnabled())
effect->setEnabled(true);
}
void MyPushButton::leaveEvent(QEvent *event)
{
if (this->isEnabled())
effect->setEnabled(false);
}
Run Code Online (Sandbox Code Playgroud)
然后我在编辑器中右键单击 QPushButton,选择“升级到...”,并将 MyPushButton 添加为“升级类名称”。
它的工作方式就像一个魅力,并且非常容易扩展或定制,因为它适用于任何事件。