QtCanpool 3.3.0
载入中...
搜索中...
未找到
ribboncontainers.cpp
浏览该文件的文档.
1
5#include "ribboncontainers.h"
6#include "ribbonmenu.h"
7
8#include <QDebug>
9#include <QBoxLayout>
10#include <QHBoxLayout>
11#include <QLabel>
12#include <QPaintEvent>
13#include <QPainter>
14#include <QStylePainter>
15
16#include <QGridLayout>
17#include <QButtonGroup>
18#include <QToolButton>
19
21
22class RibbonCtrlContainerPrivate
23{
24 QX_DECLARE_PUBLIC(RibbonCtrlContainer)
25public:
26 RibbonCtrlContainerPrivate();
27
28 void init();
29 void setWidget(QWidget *w);
30 void takeWidget(QWidget *w);
31public:
32 QWidget *m_widget;
33 QBoxLayout *m_layout;
34 QLabel *m_labelPixmap;
35 QLabel *m_labelText;
36 QIcon m_icon;
37 QSize m_iconSize;
38 Qt::Orientation m_orientation;
39};
40
41RibbonCtrlContainerPrivate::RibbonCtrlContainerPrivate()
42 : m_widget(Q_NULLPTR)
43 , m_iconSize(18, 18)
44 , m_orientation(Qt::Horizontal)
45{
46}
47
48void RibbonCtrlContainerPrivate::init()
49{
50 Q_Q(RibbonCtrlContainer);
51 QHBoxLayout *headerLayout = new QHBoxLayout();
52 headerLayout->setSpacing(2);
53 headerLayout->setContentsMargins(0, 0, 0, 0);
54
55 m_labelPixmap = new QLabel(q);
56 m_labelPixmap->setObjectName(QLatin1String("logo"));
57 m_labelPixmap->setAlignment(Qt::AlignCenter);
58 headerLayout->addWidget(m_labelPixmap);
59
60 m_labelText = new QLabel(q);
61 m_labelText->setObjectName(QLatin1String("title"));
62 headerLayout->addWidget(m_labelText);
63
64 QBoxLayout::Direction direction =
65 m_orientation == Qt::Horizontal ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom;
66 m_layout = new QBoxLayout(direction, q);
67 m_layout->setSpacing(2);
68 m_layout->setContentsMargins(0, 0, 0, 0);
69 m_layout->addLayout(headerLayout);
70}
71
72void RibbonCtrlContainerPrivate::setWidget(QWidget *w)
73{
74 Q_Q(RibbonCtrlContainer);
75 if (m_widget) {
76 QWidget *oldwidget = m_widget;
77 takeWidget(oldwidget);
78 oldwidget->deleteLater();
79 }
80 m_widget = w;
81 if (!w) {
82 return;
83 }
84 if (w->parent() != q) {
85 w->setParent(q);
86 }
87 m_layout->addWidget(w);
88 QSizePolicy sizePolicy(m_orientation == Qt::Horizontal ? QSizePolicy::Expanding : QSizePolicy::Preferred,
89 QSizePolicy::Preferred);
90 sizePolicy.setHorizontalStretch(0);
91 sizePolicy.setVerticalStretch(0);
92 w->setSizePolicy(sizePolicy);
93}
94
95void RibbonCtrlContainerPrivate::takeWidget(QWidget *w)
96{
97 int i = m_layout->indexOf(w);
98 if (i >= 0) {
99 QLayoutItem *item = m_layout->takeAt(i);
100 delete item;
101 }
102}
103
104RibbonCtrlContainer::RibbonCtrlContainer(QWidget *parent)
105 : RibbonCtrlContainer(Qt::Horizontal, parent)
106{
107}
108
109RibbonCtrlContainer::RibbonCtrlContainer(Qt::Orientation orientation, QWidget *parent)
110 : QWidget(parent)
111{
114 d->m_orientation = orientation;
115 d->init();
116}
117
122
124{
126 d->m_labelPixmap->setVisible(b);
127}
128
130{
132 d->m_labelText->setVisible(b);
133}
134
136{
138 d->m_icon = i;
139 d->m_labelPixmap->setPixmap(i.pixmap(d->m_iconSize));
140}
141
143{
144 Q_D(const RibbonCtrlContainer);
145 return d->m_icon;
146}
147
148void RibbonCtrlContainer::setIconSize(const QSize &size)
149{
151 d->m_iconSize = size;
152 setIcon(icon());
153}
154
156{
157 Q_D(const RibbonCtrlContainer);
158 return d->m_iconSize;
159}
160
161void RibbonCtrlContainer::setText(const QString &t)
162{
164 d->m_labelText->setText(t);
165}
166
168{
169 Q_D(const RibbonCtrlContainer);
170 return d->m_labelText->text();
171}
172
174{
176 d->setWidget(w);
177}
178
180{
181 Q_D(const RibbonCtrlContainer);
182 return d->m_widget;
183}
184
185Qt::Orientation RibbonCtrlContainer::orientation() const
186{
187 Q_D(const RibbonCtrlContainer);
188 return d->m_orientation;
189}
190
191void RibbonCtrlContainer::setOrientation(Qt::Orientation orientation)
192{
194 if (orientation == d->m_orientation) {
195 return;
196 }
197 d->m_orientation = orientation;
198 if (orientation == Qt::Horizontal) {
199 d->m_layout->setDirection(QBoxLayout::LeftToRight);
200 d->m_labelPixmap->setAlignment(Qt::AlignCenter);
201 } else {
202 d->m_layout->setDirection(QBoxLayout::TopToBottom);
203 d->m_labelPixmap->setAlignment(Qt::AlignLeft);
204 }
205}
206
207/* RibbonGridContainerPrivate */
208class RibbonGridContainerPrivate
209{
211public:
212 RibbonGridContainerPrivate();
213
214 void init();
215 void updateLayout();
216 void addWidget(QWidget *widget);
217public:
218 QGridLayout *m_gridLayout;
219 QButtonGroup *m_buttonGroup;
220 int m_columnCount = 5;
221 bool m_hasReceivedEnter = false;
222};
223
224RibbonGridContainerPrivate::RibbonGridContainerPrivate()
225{
226}
227
228void RibbonGridContainerPrivate::init()
229{
230 Q_Q(RibbonGridContainer);
231
232 m_gridLayout = new QGridLayout(q);
233 m_gridLayout->setSpacing(0);
234 m_gridLayout->setContentsMargins(2, 1, 2, 1);
235 q->setLayout(m_gridLayout);
236
237 m_buttonGroup = new QButtonGroup(q);
238
239#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
240 QObject::connect(m_buttonGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
241#else
242 QObject::connect(m_buttonGroup,
243 static_cast<void (QButtonGroup::*)(QAbstractButton *)>(&QButtonGroup::buttonClicked),
244#endif
245 q, [q](QAbstractButton *) {
246 QWidget *parWidget = q->parentWidget();
247 while (parWidget) {
248 if (RibbonMenu *menu = qobject_cast<RibbonMenu *>(parWidget)) {
249 menu->hide();
250 break;
251 }
252 parWidget = parWidget->parentWidget();
253 }
254 });
255}
256
257void RibbonGridContainerPrivate::updateLayout()
258{
259}
260
261void RibbonGridContainerPrivate::addWidget(QWidget *widget)
262{
263 int cnt = m_gridLayout->count();
264 int row = cnt / m_columnCount;
265 int column = row ? (cnt % m_columnCount) : cnt;
266 m_gridLayout->addWidget(widget, row, column, Qt::AlignLeft);
267}
268
269/* RibbonGridContainer */
271 : QWidget(parent)
272{
275 d->init();
276}
277
282
283QAction *RibbonGridContainer::addAction(const QIcon &icon, const QString &text)
284{
286 QAction *action = new QAction(icon, text, this);
287 QToolButton *btn = new QToolButton(this);
288 btn->setAutoRaise(true);
289 btn->setFocusPolicy(Qt::NoFocus);
290 btn->setDefaultAction(action);
291 d->m_buttonGroup->addButton(btn);
292 d->addWidget(btn);
293 return action;
294}
295
297{
299 d->m_buttonGroup->addButton(button);
300 d->addWidget(button);
301}
302
304{
306 if (count < 3) {
307 count = 3;
308 }
309 if (d->m_columnCount == count) {
310 return;
311 }
312 d->m_columnCount = count;
313 d->updateLayout();
314}
315
317{
318 Q_D(const RibbonGridContainer);
319 return d->m_columnCount;
320}
321
323{
324 Q_UNUSED(event);
326 if (!d->m_hasReceivedEnter) {
327 QWidget *parWidget = parentWidget();
328 while (parWidget) {
329 if (RibbonMenu *menu = qobject_cast<RibbonMenu *>(parWidget)) {
330 menu->setActiveAction(nullptr);
331 break;
332 }
333 parWidget = parWidget->parentWidget();
334 }
335 }
336 d->m_hasReceivedEnter = true;
337}
338
340{
341 Q_UNUSED(event);
343 d->m_hasReceivedEnter = false;
344}
345
void setOrientation(Qt::Orientation orientation)
Qt::Orientation orientation() const
RibbonCtrlContainer(QWidget *parent=Q_NULLPTR)
void setIconSize(const QSize &size)
virtual void leaveEvent(QEvent *event)
QAction * addAction(const QIcon &icon, const QString &text)
RibbonGridContainer(QWidget *parent=nullptr)
void addButton(QAbstractButton *button)
virtual void enterEvent(QEvent *event)
#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