如果您想为 QWidgets 指定依赖于事件的行为,而不是对每个事件进行子类化,则可以使用事件过滤器。如Qt 的文档所述,创建一个事件过滤器,并将其应用于相关的小部件。
我在下面写了一个简单的示例,但请注意,当您开始有多种交互行为时,以这种方式使用过滤器会变得越来越复杂。我发现它们对于需要跨多种不同类型的小部件应用的简单行为最有效。
class WidgetHoverEffectEnabler : public QObject
{
Q_OBJECT
public:
WidgetHoverEffectEnabler(QObject* parent);
virtual bool eventFilter(QObject* obj, QEvent* e);
};
WidgetHoverEffectEnabler::WidgetHoverEffectEnabler(QObject* parent)
: QObject(parent)
{
}
bool WidgetHoverEffectEnabler::eventFilter(QObject* obj, QEvent* e)
{
if(QWidget* widget = qobject_cast<QWidget*>(obj))
{
QGraphicsEffect* effect = widget->graphicsEffect();
if(effect)
{
if(e->type() == QEvent::Enter)
{
effect->setEnabled(true);
}
else if(e->type() == QEvent::Leave)
{
effect->setEnabled(false);
}
}
}
return QObject::eventFilter(obj, e);
}
然后您可以在初始化期间在您的小部件上安装该过滤器:
// works on your button
QPushButton* button = new QPushButton;
QGraphicsDropShadowEffect* dropShadowEffect = new QGraphicsDropShadowEffect;
dropShadowEffect->setEnabled(false);
button->setGraphicsEffect(dropShadowEffect);
button->installEventFilter(new WidgetHoverEffectEnabler(button));
// works on any widget
QLabel* label = new QLabel("Read me!");
QGraphicsBlurEffect* blurEffect = new QGraphicsBlurEffect;
blurEffect->setEnabled(false);
label->setGraphicsEffect(blurEffect);
label->installEventFilter(new WidgetHoverEffectEnabler(label));