From 7e7f78bc135ca1822b9f8f0cc7749631ec0c2d00 Mon Sep 17 00:00:00 2001 From: laserpants Date: Mon, 25 Apr 2016 02:37:59 +0300 Subject: [PATCH] implement Icon Menu and examples --- components/iconmenu.cpp | 32 +++++++++++++++++++++++++++++++- components/iconmenu.h | 24 ++++++++++++++++++++++-- examples/iconmenuexamples.cpp | 3 ++- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/components/iconmenu.cpp b/components/iconmenu.cpp index 12bf001..0569dd3 100644 --- a/components/iconmenu.cpp +++ b/components/iconmenu.cpp @@ -1,10 +1,40 @@ +#include #include "iconmenu.h" +#include "menu.h" -IconMenu::IconMenu(QWidget *parent) +MenuOverlay::MenuOverlay(QWidget *parent) : QWidget(parent) { + setAttribute(Qt::WA_TransparentForMouseEvents); + setAttribute(Qt::WA_NoSystemBackground); +} + +MenuOverlay::~MenuOverlay() +{ +} + +IconMenu::IconMenu(const QIcon &icon, QWidget *parent) + : IconButton(icon, parent), + _overlay(new MenuOverlay(parent)), + _geometryWidget(0), + _menu(new Menu) +{ + _menu->setParent(_overlay); + + _menu->addMenuItem("Maps"); + _menu->addMenuItem("Books"); + _menu->addMenuItem("Flights"); + _menu->addMenuItem("Apps"); } IconMenu::~IconMenu() { } + +bool IconMenu::event(QEvent *event) +{ + if (QEvent::ParentChange == event->type()) { + _menu->setParent(parentWidget()); + } + return IconButton::event(event); +} diff --git a/components/iconmenu.h b/components/iconmenu.h index 8a4cf14..1acf23e 100644 --- a/components/iconmenu.h +++ b/components/iconmenu.h @@ -2,14 +2,34 @@ #define ICONMENU_H #include +#include "iconbutton.h" -class IconMenu : public QWidget +class Menu; + +class MenuOverlay : public QWidget { Q_OBJECT public: - explicit IconMenu(QWidget *parent = 0); + explicit MenuOverlay(QWidget *parent = 0); + ~MenuOverlay(); +}; + +class IconMenu : public IconButton +{ + Q_OBJECT + +public: + explicit IconMenu(const QIcon &icon, QWidget *parent = 0); ~IconMenu(); + +protected: + bool event(QEvent *event) Q_DECL_OVERRIDE; + +private: + MenuOverlay *const _overlay; + QWidget *_geometryWidget; + Menu *const _menu; }; #endif // ICONMENU_H diff --git a/examples/iconmenuexamples.cpp b/examples/iconmenuexamples.cpp index 1994dd5..e790c11 100644 --- a/examples/iconmenuexamples.cpp +++ b/examples/iconmenuexamples.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "iconmenuexamples.h" #include "components/iconmenu.h" #include "exampleview.h" @@ -11,7 +12,7 @@ IconMenuExamples::IconMenuExamples(QWidget *parent) QLayout *layout = widget()->layout(); { - IconMenu *iconMenu = new IconMenu; + IconMenu *iconMenu = new IconMenu(QIcon("../qt-material-widgets/face.svg")); ExampleView *view = new ExampleView; view->setWidget(iconMenu);