Widgets don't receive hover event in windows style
-
I am trying to change the appearance of QMenuBar item on hover, however, it seems the widget doesn't receive the hover event. Only the sunken state is getting honoured. Following is my style code
class MenuBarStyle : public QProxyStyle { public: PtMenuBarStyle() :QProxyStyle("windows") {} void drawControl(ControlElement element, const QStyleOption* pOption, QPainter* pPainter, const QWidget* pWidget = nullptr) const override { if (element == CE_MenuBarItem) { if (pOption->state & QStyle::State_MouseOver || pOption->state & QStyle::State_Sunken) { pPainter->fillRect(pOption->rect, QColor("#FF0000")); } QCommonStyle::drawControl(element, pOption, pPainter, pWidget); } else if (element == CE_MenuBarEmptyArea) { } else { QProxyStyle::drawControl(element, pOption, pPainter, pWidget); } } int pixelMetric(PixelMetric metric, const QStyleOption* pOption = nullptr, const QWidget* pWidget = nullptr) const override { if (metric == PM_MenuBarItemSpacing) { return PtUtil::getDimensionBasedOnDPI(16); } else { return QProxyStyle::pixelMetric(metric, pOption, pWidget); } } };
I have also called
setAttribute(Qt::WA_Hover)
andsetMouseTracking(true)
on the QMenuBar object but it still doesn't work. -
I am trying to change the appearance of QMenuBar item on hover, however, it seems the widget doesn't receive the hover event. Only the sunken state is getting honoured. Following is my style code
class MenuBarStyle : public QProxyStyle { public: PtMenuBarStyle() :QProxyStyle("windows") {} void drawControl(ControlElement element, const QStyleOption* pOption, QPainter* pPainter, const QWidget* pWidget = nullptr) const override { if (element == CE_MenuBarItem) { if (pOption->state & QStyle::State_MouseOver || pOption->state & QStyle::State_Sunken) { pPainter->fillRect(pOption->rect, QColor("#FF0000")); } QCommonStyle::drawControl(element, pOption, pPainter, pWidget); } else if (element == CE_MenuBarEmptyArea) { } else { QProxyStyle::drawControl(element, pOption, pPainter, pWidget); } } int pixelMetric(PixelMetric metric, const QStyleOption* pOption = nullptr, const QWidget* pWidget = nullptr) const override { if (metric == PM_MenuBarItemSpacing) { return PtUtil::getDimensionBasedOnDPI(16); } else { return QProxyStyle::pixelMetric(metric, pOption, pWidget); } } };
I have also called
setAttribute(Qt::WA_Hover)
andsetMouseTracking(true)
on the QMenuBar object but it still doesn't work.QMenuBar::paintEvent() does not set the MouseOver state: https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qmenubar.cpp#n882 and https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qmenubar.cpp#n882
Looks like you have to derive from QMenuBar, override initStyleOption() and set it by your yourself.