SVN commit 802873 by ereslibre: Prevent the title of the KMenu from being clicked, since it is a QToolButton really. We install an event filter for this purpose that will discard every event except Paint, and keyboard events (what does accept keyboard navigation on the menu itself) M +52 -18 kmenu.cpp --- trunk/KDE/kdelibs/kdeui/widgets/kmenu.cpp #802872:802873 @@ -21,6 +21,7 @@ #include "kmenu.h" #include "khbox.h" +#include #include #include #include @@ -40,25 +41,9 @@ class KMenu::KMenuPrivate { public: - KMenuPrivate (KMenu *_parent) - : parent(_parent) - , noMatches(false) - , shortcuts(false) - , autoExec(false) - , lastHitAction(0L) - , mouseButtons(Qt::NoButton) - , keyboardModifiers(Qt::NoModifier) - , ctxMenu(0) - , highlightedAction(0) - { - resetKeyboardVars(); - } + KMenuPrivate (KMenu *_parent); + ~KMenuPrivate (); - ~KMenuPrivate () - { - delete ctxMenu; - } - void resetKeyboardVars(bool noMatches = false); void actionHovered(QAction* action); void showCtxMenu(const QPoint &pos); @@ -82,9 +67,57 @@ // support for RMB menus on menus QMenu* ctxMenu; QPointer highlightedAction; + + class EventSniffer; + EventSniffer *eventSniffer; }; +class KMenu::KMenuPrivate::EventSniffer + : public QObject +{ +public: + EventSniffer(QObject *parent = 0) + : QObject(parent) { } + ~EventSniffer() { } + + bool eventFilter(QObject *object, QEvent *event) + { + Q_UNUSED(object); + + if (event->type() == QEvent::Paint || + event->type() == QEvent::KeyPress || + event->type() == QEvent::KeyRelease) { + return false; + } + + event->accept(); + return true; + } +}; + +KMenu::KMenuPrivate::KMenuPrivate (KMenu *_parent) + : parent(_parent) + , noMatches(false) + , shortcuts(false) + , autoExec(false) + , lastHitAction(0L) + , mouseButtons(Qt::NoButton) + , keyboardModifiers(Qt::NoModifier) + , ctxMenu(0) + , highlightedAction(0) + , eventSniffer(new EventSniffer) +{ + resetKeyboardVars(); +} + +KMenu::KMenuPrivate::~KMenuPrivate () +{ + delete ctxMenu; + delete eventSniffer; +} + + /** * custom variant type for QAction::data of kmenu context menus * @author Joseph Wenninger @@ -143,6 +176,7 @@ QWidgetAction *action = new QWidgetAction(this); QToolButton *titleButton = new QToolButton(this); + titleButton->installEventFilter(d->eventSniffer); titleButton->setDefaultAction(buttonAction); titleButton->setDown(true); // prevent hover style changes in some styles titleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);