virtual bool eventFilter(QObject *o, QEvent *e) { QToolButton *button = qobject_cast<QToolButton *>(o); if (!button) return false; if (button->isEnabled()) return false; ToolBar *toolbar = qobject_cast<ToolBar *>(button->parentWidget()); if (!toolbar) return false; switch (e->type()) { case QEvent::MouseButtonPress: toolbar->widgetPressed(); return true; case QEvent::MouseMove: { QMouseEvent event(QEvent::MouseMove, toolbar->mapFromGlobal(QCursor::pos()), Qt::NoButton, ((QMouseEvent *)e)->buttons(), ((QMouseEvent *)e)->modifiers()); toolbar->mouseMoveEvent(&event); return event.isAccepted(); } case QEvent::ContextMenu: { QContextMenuEvent event(QContextMenuEvent::Mouse, toolbar->mapFromGlobal(QCursor::pos())); toolbar->contextMenuEvent(&event); return event.isAccepted(); } default: return false; } }