QtCanpool 3.3.0
载入中...
搜索中...
未找到
ribbonbuttongroup.cpp
浏览该文件的文档.
1
5#include "ribbonbuttongroup.h"
6#include "ribbongroup_p.h"
7#include "ribbonbutton.h"
8
9#include <QActionEvent>
10#include <QHBoxLayout>
11#include <QWidgetAction>
12
14
15/* RibbonButtonGroupPrivate */
16class RibbonButtonGroupPrivate
17{
18 QX_DECLARE_PUBLIC(RibbonButtonGroup)
19public:
20 RibbonButtonGroupPrivate();
21
22 void init();
23public:
24 QMap<QAction *, QWidget *> m_items;
25};
26
27RibbonButtonGroupPrivate::RibbonButtonGroupPrivate()
28{
29}
30
31void RibbonButtonGroupPrivate::init()
32{
33 Q_Q(RibbonButtonGroup);
34 QHBoxLayout *layout = new QHBoxLayout(q);
35 layout->setContentsMargins(0, 0, 0, 0);
36 layout->setSpacing(0);
37 q->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
38}
39
40/* RibbonButtonGroup */
41RibbonButtonGroup::RibbonButtonGroup(QWidget *parent)
42 : QFrame(parent)
43{
46 d->init();
47}
48
50
51QAction *RibbonButtonGroup::addAction(QAction *a)
52{
53 QWidget::addAction(a);
54 return a;
55}
56
57QAction *RibbonButtonGroup::addAction(const QString &text, const QIcon &icon, QToolButton::ToolButtonPopupMode popMode)
58{
60 QAction *a = new QAction(icon, text, this);
61
62 addAction(a);
63 RibbonButton *btn = qobject_cast<RibbonButton *>(d->m_items.value(a));
64 if (btn) {
65 btn->setPopupMode(popMode);
66 }
67 return a;
68}
69
70QAction *RibbonButtonGroup::addMenu(QMenu *menu, QToolButton::ToolButtonPopupMode popMode)
71{
73 QAction *a = menu->menuAction();
74
75 addAction(a);
76 RibbonButton *btn = qobject_cast<RibbonButton *>(d->m_items.value(a));
77 if (btn) {
78 btn->setPopupMode(popMode);
79 }
80 return a;
81}
82
84{
85 QAction *a = new QAction(this);
86
87 a->setSeparator(true);
88 addAction(a);
89 return (a);
90}
91
92QAction *RibbonButtonGroup::addWidget(QWidget *w)
93{
94 QWidgetAction *a = new QWidgetAction(this);
95
96 a->setDefaultWidget(w);
97 w->setAttribute(Qt::WA_Hover);
98 addAction(a);
99 return a;
100}
101
103{
104 return layout()->sizeHint();
105}
106
108{
109 return layout()->minimumSize();
110}
111
113{
115 QAction *action = e->action();
116 QWidgetAction *widgetAction = qobject_cast<QWidgetAction *>(action);
117 QWidget *widget = nullptr;
118
119 switch (e->type()) {
120 case QEvent::ActionAdded: {
121 if (widgetAction) {
122 widget = widgetAction->requestWidget(this);
123 if (widget != Q_NULLPTR) {
124 widget->setAttribute(Qt::WA_LayoutUsesWidgetRect);
125 widget->show();
126 }
127 } else if (action->isSeparator()) {
128 RibbonSeparator *sp = new RibbonSeparator(this);
129 sp->setTopBottomMargins(3, 3);
130 widget = sp;
131 }
132 if (!widget) {
133 RibbonButton *button = new RibbonButton(this);
134 button->setAutoRaise(true);
135 button->setFocusPolicy(Qt::NoFocus);
136 button->setButtonType(RibbonButton::SmallButton);
137 button->setToolButtonStyle(Qt::ToolButtonIconOnly);
138 button->setDefaultAction(action);
139 QObject::connect(button, &RibbonButton::triggered, this, &RibbonButtonGroup::actionTriggered);
140 widget = button;
141 }
142 layout()->addWidget(widget);
143 d->m_items.insert(action, widget);
144 } break;
145 case QEvent::ActionChanged: {
146 layout()->invalidate();
147 } break;
148 case QEvent::ActionRemoved: {
149 action->disconnect(this);
150 widget = d->m_items.value(action);
151 layout()->removeWidget(widget);
152 d->m_items.remove(action);
153 if (!widgetAction) {
154 // destroy the RibbonButton/RibbonSeparator
155 delete widget;
156 }
157 if (action->parent() == this) {
158 action->setParent(nullptr);
159 delete action;
160 }
161 layout()->invalidate();
162 } break;
163 default:
164 break;
165 }
166}
167
QAction * addWidget(QWidget *w)
QSize sizeHint() const override
virtual void actionEvent(QActionEvent *e) override
QAction * addAction(QAction *a)
void actionTriggered(QAction *action)
QAction * addMenu(QMenu *menu, QToolButton::ToolButtonPopupMode popMode=QToolButton::InstantPopup)
QSize minimumSizeHint() const override
Ribbon 界面适用的 toolButton
void setTopBottomMargins(int top, int bottom)
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_FINI_PRIVATE()
#define QX_RIBBON_END_NAMESPACE
#define QX_RIBBON_BEGIN_NAMESPACE
QColor text
QColor button