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));