Skip to content

Instantly share code, notes, and snippets.

@pasbi
Created March 10, 2019 09:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pasbi/336a75248e1fee2ece7c77a24babfe99 to your computer and use it in GitHub Desktop.
Save pasbi/336a75248e1fee2ece7c77a24babfe99 to your computer and use it in GitHub Desktop.
#include <QMainWindow>
#include <QApplication>
#include <QMenu>
#include <QMenuBar>
#include <QWidgetAction>
#include <QTextEdit>
#include <QLabel>
#include <QDebug>
class MyActionWidget : public QLabel
{
public:
MyActionWidget(const QString& text, QWidget* parent) : QLabel(text, parent) {}
private:
void set_highlighted(bool highlighted)
{
// self-tinkered highlighting
setBackgroundRole(highlighted ? QPalette::Highlight : QPalette::Window);
setAutoFillBackground(highlighted);
}
protected:
void enterEvent(QEvent*) override {
// `enterEvent` is not even called on mouse hover until other sub-menu closes.
qDebug() << "Enter MyActionWidget(" << text() << ")";
set_highlighted(true);
}
void leaveEvent(QEvent*) override {
qDebug() << "Leave MyActionWidget(" << text() << ")";
set_highlighted(false);
}
};
class MyAction : public QWidgetAction
{
public:
MyAction(const QString& text, QObject* parent) : QWidgetAction(parent), m_text(text) {}
#ifdef REPRODUCE_FIRST_ANIMATION
QWidget* createWidget(QWidget* parent) override { return QWidgetAction::createWidget(parent); } // works as expected; but does not produce a MyActionWidget
#else
QWidget* createWidget(QWidget* parent) override { return new MyActionWidget(m_text, parent); }
#endif
private:
const QString m_text;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
QMenu* menu = new QMenu("The Menu");
menu->addAction("Standard QAction 1");
menu->addAction("Standard QAction 2");
QMenu* sub_menu = new QMenu("sub menu", menu);
sub_menu->addAction("sub action 1");
sub_menu->addAction("sub action 2");
menu->addMenu(sub_menu);
menu->addAction(new MyAction("My Action 1", menu));
menu->addAction(new MyAction("My Action 2", menu));
menu->addAction("Standard QAction 3");
menu->addAction("Standard QAction 4");
QMenuBar* menu_bar = new QMenuBar();
menu_bar->addMenu(menu);
w.setMenuBar(menu_bar);
w.setCentralWidget(new QTextEdit());
w.setWindowTitle("Menu Example");
w.show();
return a.exec();
}
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = menu
TEMPLATE = app
SOURCES += main.cpp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment