mirror of
https://github.com/tnodir/fort
synced 2024-11-15 07:25:18 +00:00
UI: MenuWidget: Relayout on child add/remove too
This commit is contained in:
parent
379786cf1b
commit
4995cb3b3b
@ -1,9 +1,7 @@
|
|||||||
#include "controlutil.h"
|
#include "controlutil.h"
|
||||||
|
|
||||||
#include <QActionEvent>
|
|
||||||
#include <QBoxLayout>
|
#include <QBoxLayout>
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
@ -176,29 +174,17 @@ QMenu *ControlUtil::createMenu(QWidget *parent)
|
|||||||
QMenu *ControlUtil::createMenuByLayout(QBoxLayout *layout, QWidget *parent)
|
QMenu *ControlUtil::createMenuByLayout(QBoxLayout *layout, QWidget *parent)
|
||||||
{
|
{
|
||||||
auto menu = createMenu(parent);
|
auto menu = createMenu(parent);
|
||||||
|
auto wa = new QWidgetAction(menu);
|
||||||
|
|
||||||
auto menuWidget = new MenuWidget();
|
auto menuWidget = new MenuWidget(menu, wa);
|
||||||
menuWidget->setLayout(layout);
|
menuWidget->setLayout(layout);
|
||||||
|
|
||||||
auto wa = new QWidgetAction(menu);
|
|
||||||
wa->setDefaultWidget(menuWidget);
|
wa->setDefaultWidget(menuWidget);
|
||||||
menu->addAction(wa);
|
menu->addAction(wa);
|
||||||
|
|
||||||
menu->connect(menuWidget, &MenuWidget::layoutRequested, [=] { relayoutMenu(menu, wa); });
|
|
||||||
|
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlUtil::relayoutMenu(QMenu *menu, QAction *action)
|
|
||||||
{
|
|
||||||
if (!action) {
|
|
||||||
action = menu->actions().first();
|
|
||||||
}
|
|
||||||
|
|
||||||
QActionEvent e(QEvent::ActionChanged, action);
|
|
||||||
QCoreApplication::sendEvent(menu, &e);
|
|
||||||
}
|
|
||||||
|
|
||||||
QBoxLayout *ControlUtil::createLayoutByWidgets(const QList<QWidget *> &widgets, Qt::Orientation o)
|
QBoxLayout *ControlUtil::createLayoutByWidgets(const QList<QWidget *> &widgets, Qt::Orientation o)
|
||||||
{
|
{
|
||||||
auto layout =
|
auto layout =
|
||||||
|
@ -59,7 +59,6 @@ public:
|
|||||||
|
|
||||||
static QMenu *createMenu(QWidget *parent = nullptr);
|
static QMenu *createMenu(QWidget *parent = nullptr);
|
||||||
static QMenu *createMenuByLayout(QBoxLayout *layout, QWidget *parent);
|
static QMenu *createMenuByLayout(QBoxLayout *layout, QWidget *parent);
|
||||||
static void relayoutMenu(QMenu *menu, QAction *action = nullptr);
|
|
||||||
|
|
||||||
static QBoxLayout *createLayoutByWidgets(
|
static QBoxLayout *createLayoutByWidgets(
|
||||||
const QList<QWidget *> &widgets, Qt::Orientation o = Qt::Vertical);
|
const QList<QWidget *> &widgets, Qt::Orientation o = Qt::Vertical);
|
||||||
|
@ -1,8 +1,16 @@
|
|||||||
#include "menuwidget.h"
|
#include "menuwidget.h"
|
||||||
|
|
||||||
|
#include <QActionEvent>
|
||||||
|
#include <QCoreApplication>
|
||||||
#include <QEvent>
|
#include <QEvent>
|
||||||
|
#include <QMenu>
|
||||||
|
|
||||||
MenuWidget::MenuWidget(QWidget *parent) : QWidget(parent) { }
|
MenuWidget::MenuWidget(QMenu *menu, QAction *action, QWidget *parent) :
|
||||||
|
QWidget(parent), m_menu(menu), m_action(action)
|
||||||
|
{
|
||||||
|
connect(this, &MenuWidget::layoutChanged, this, &MenuWidget::relayoutMenu,
|
||||||
|
Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection));
|
||||||
|
}
|
||||||
|
|
||||||
bool MenuWidget::event(QEvent *event)
|
bool MenuWidget::event(QEvent *event)
|
||||||
{
|
{
|
||||||
@ -10,8 +18,10 @@ bool MenuWidget::event(QEvent *event)
|
|||||||
const bool res = QWidget::event(event);
|
const bool res = QWidget::event(event);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case QEvent::ChildAdded:
|
||||||
|
case QEvent::ChildRemoved:
|
||||||
case QEvent::LayoutRequest: {
|
case QEvent::LayoutRequest: {
|
||||||
emit layoutRequested();
|
emit layoutChanged();
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -19,3 +29,9 @@ bool MenuWidget::event(QEvent *event)
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MenuWidget::relayoutMenu()
|
||||||
|
{
|
||||||
|
QActionEvent e(QEvent::ActionChanged, m_action);
|
||||||
|
QCoreApplication::sendEvent(m_menu, &e);
|
||||||
|
}
|
||||||
|
@ -8,13 +8,20 @@ class MenuWidget : public QWidget
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MenuWidget(QWidget *parent = nullptr);
|
explicit MenuWidget(QMenu *menu, QAction *action, QWidget *parent = nullptr);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void layoutRequested();
|
void layoutChanged();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool event(QEvent *event) override;
|
bool event(QEvent *event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void relayoutMenu();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QMenu *m_menu = nullptr;
|
||||||
|
QAction *m_action = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MENUWIDGET_H
|
#endif // MENUWIDGET_H
|
||||||
|
Loading…
Reference in New Issue
Block a user