QtCanpool 3.3.0
载入中...
搜索中...
未找到
ribbongallery.cpp
浏览该文件的文档.
1
5#include "ribbongallery.h"
6#include "ribbongallery_p.h"
7#include "ribboncontrols.h"
8
9#include <QApplication>
10#include <QIcon>
11#include <QActionGroup>
12#include <QDebug>
13#include <QLabel>
14#include <QResizeEvent>
15#include <QScrollBar>
16#include <QVBoxLayout>
17
19
20/* RibbonGalleryPrivate */
21class RibbonGalleryPrivate
22{
23 QX_DECLARE_PUBLIC(RibbonGallery)
24public:
25 RibbonGalleryPrivate();
26public:
27 void init();
28 void setViewPort(RibbonGalleryGroup *v);
29 RibbonGalleryViewport *getPopupViewPort();
30public:
31 RibbonControlButton *m_buttonUp;
32 RibbonControlButton *m_buttonDown;
33 RibbonControlButton *m_buttonMore;
34 RibbonGalleryViewport *m_popupWidget;
35 RibbonGalleryGroup *m_viewportGroup;
36 QBoxLayout *m_btnLayout;
37 QBoxLayout *m_layout;
38 static int s_galleryButtonMaximumWidth;
39};
40
41int RibbonGalleryPrivate::s_galleryButtonMaximumWidth = 15;
42
43RibbonGalleryPrivate::RibbonGalleryPrivate()
44 : m_popupWidget(Q_NULLPTR)
45 , m_viewportGroup(Q_NULLPTR)
46{
47}
48
49void RibbonGalleryPrivate::init()
50{
51 Q_Q(RibbonGallery);
52 m_buttonUp = new RibbonControlButton(q);
53 m_buttonDown = new RibbonControlButton(q);
54 m_buttonMore = new RibbonControlButton(q);
55 m_buttonUp->setToolButtonStyle(Qt::ToolButtonIconOnly);
56 m_buttonDown->setToolButtonStyle(Qt::ToolButtonIconOnly);
57 m_buttonMore->setToolButtonStyle(Qt::ToolButtonIconOnly);
58 m_buttonUp->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
59 m_buttonDown->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
60 m_buttonMore->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
61 m_buttonUp->setObjectName(QStringLiteral("RibbonGalleryButtonUp"));
62 m_buttonDown->setObjectName(QStringLiteral("RibbonGalleryButtonDown"));
63 m_buttonMore->setObjectName(QStringLiteral("RibbonGalleryButtonMore"));
64 m_buttonUp->setMaximumWidth(s_galleryButtonMaximumWidth);
65 m_buttonDown->setMaximumWidth(s_galleryButtonMaximumWidth);
66 m_buttonMore->setMaximumWidth(s_galleryButtonMaximumWidth);
67 m_buttonUp->setIcon(QIcon(":/image/res/arrow_up.png"));
68 m_buttonDown->setIcon(QIcon(":/image/res/arrow_down.png"));
69 m_buttonMore->setIcon(QIcon(":/image/res/arrow_more.png"));
70 QObject::connect(m_buttonUp, &QAbstractButton::clicked, q, &RibbonGallery::pageUp);
71 QObject::connect(m_buttonDown, &QAbstractButton::clicked, q, &RibbonGallery::pageDown);
72 QObject::connect(m_buttonMore, &QAbstractButton::clicked, q, &RibbonGallery::showMoreDetail);
73 QObject::connect(q, &RibbonGallery::triggered, q, &RibbonGallery::onTriggered); // 信号转发
74
75 m_btnLayout = new QBoxLayout(QBoxLayout::TopToBottom);
76 m_btnLayout->setSpacing(0);
77 m_btnLayout->setContentsMargins(0, 0, 0, 0);
78 m_btnLayout->addWidget(m_buttonUp);
79 m_btnLayout->addWidget(m_buttonDown);
80 m_btnLayout->addWidget(m_buttonMore);
81 m_layout = new QBoxLayout(QBoxLayout::RightToLeft);
82 m_layout->setSpacing(0);
83 m_layout->setContentsMargins(0, 0, 0, 0);
84 m_layout->addLayout(m_btnLayout);
85 m_layout->addStretch();
86 q->setLayout(m_layout);
87}
88
89void RibbonGalleryPrivate::setViewPort(RibbonGalleryGroup *v)
90{
91 Q_Q(RibbonGallery);
92 if (Q_NULLPTR == m_viewportGroup) {
93 m_viewportGroup = new RibbonGalleryGroup(q);
94 m_layout->addWidget(m_viewportGroup, 1);
95 }
96 m_viewportGroup->setRecalcGridSizeBlock(true);
97 m_viewportGroup->setGalleryGroupStyle(v->galleryGroupStyle());
98 m_viewportGroup->setDisplayRow(v->displayRow());
99 m_viewportGroup->setSpacing(v->spacing());
100 m_viewportGroup->setGridMaximumWidth(v->gridMaximumWidth());
101 m_viewportGroup->setGridMinimumWidth(v->gridMinimumWidth());
102 m_viewportGroup->setRecalcGridSizeBlock(false);
103 m_viewportGroup->recalcGridSize(m_viewportGroup->height());
104 m_viewportGroup->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
105 m_viewportGroup->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
106 m_viewportGroup->setModel(v->model());
107 m_viewportGroup->show();
108}
109
110RibbonGalleryViewport *RibbonGalleryPrivate::getPopupViewPort()
111{
112 Q_Q(RibbonGallery);
113 if (Q_NULLPTR == m_popupWidget) {
114 m_popupWidget = new RibbonGalleryViewport(q);
115 }
116 return m_popupWidget;
117}
118
120
121RibbonGallery::RibbonGallery(QWidget *parent)
122 : QFrame(parent)
123{
125 Q_D(RibbonGallery);
126 d->init();
127 setFrameShape(QFrame::Box);
128 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
129 setMinimumWidth(200);
130}
131
133
139{
140 RibbonGalleryGroup *group = new RibbonGalleryGroup(this);
141 addGalleryGroup(group);
142 return group;
143}
144
150{
151 Q_D(RibbonGallery);
152 RibbonGalleryViewport *viewport = d->getPopupViewPort();
153 viewport->addWidget(group, group->groupTitle());
154 connect(group, &QAbstractItemView::clicked, this, &RibbonGallery::onItemClicked);
155 connect(group, &RibbonGalleryGroup::groupTitleChanged, this, [group, viewport](const QString &t) {
156 viewport->widgetTitleChanged(group, t);
157 });
160 setCurrentViewGroup(group);
161}
162
163RibbonGalleryGroup *RibbonGallery::addGalleryGroup(const QString &title, QList<QAction *> actions)
164{
165 RibbonGalleryGroup *group = new RibbonGalleryGroup(this);
166 if (!title.isEmpty()) {
167 group->setGroupTitle(title);
168 }
169 group->addItems(actions);
170 addGalleryGroup(group);
171 return group;
172}
173
175{
176 Q_D(const RibbonGallery);
177 return d->m_viewportGroup;
178}
179
181{
182 Q_D(RibbonGallery);
183 d->setViewPort(group);
184 QApplication::postEvent(this, new QResizeEvent(size(), size()));
185}
186
188{
189 return QSize(100, 62);
190}
191
197{
198 RibbonGalleryPrivate::s_galleryButtonMaximumWidth = w;
199}
200
202{
203 Q_D(RibbonGallery);
204 if (d->m_viewportGroup) {
205 QScrollBar *vscrollBar = d->m_viewportGroup->verticalScrollBar();
206 int v = vscrollBar->value();
207 v += vscrollBar->singleStep();
208 vscrollBar->setValue(v);
209 }
210}
211
213{
214 Q_D(RibbonGallery);
215 if (d->m_viewportGroup) {
216 QScrollBar *vscrollBar = d->m_viewportGroup->verticalScrollBar();
217 int v = vscrollBar->value();
218 v -= vscrollBar->singleStep();
219 vscrollBar->setValue(v);
220 }
221}
222
227{
228 Q_D(RibbonGallery);
229 if (Q_NULLPTR == d->m_popupWidget) {
230 return;
231 }
232 QSize popupSize = d->m_popupWidget->sizeHint();
233 QPoint start = mapToGlobal(QPoint(0, 0));
234
235 int width = d->m_viewportGroup->width(); // viewport
236
237 width += qApp->style()->pixelMetric(QStyle::PM_ScrollBarExtent); // scrollbar
238 d->m_popupWidget->setGeometry(start.x(), start.y(), width, popupSize.height());
239 d->m_popupWidget->show();
240}
241
242void RibbonGallery::onItemClicked(const QModelIndex &index)
243{
244 QObject *obj = sender();
245 RibbonGalleryGroup *group = qobject_cast<RibbonGalleryGroup *>(obj);
246 if (group) {
247 setCurrentViewGroup(group);
249 curGroup->scrollTo(index);
250 curGroup->setCurrentIndex(index);
251 }
252}
253
254void RibbonGallery::onTriggered(QAction *action)
255{
256 Q_D(RibbonGallery);
257 Q_UNUSED(action);
258 // 点击后关闭弹出窗口
259 if (d->m_popupWidget && d->m_popupWidget->isVisible()) {
260 d->m_popupWidget->hide();
261 }
262}
263
264void RibbonGallery::resizeEvent(QResizeEvent *event)
265{
266 Q_D(RibbonGallery);
267 QFrame::resizeEvent(event);
268 // 对RibbonGalleryViewport所有RibbonGalleryGroup重置尺寸
269 int h = layout()->contentsRect().height();
270 if (d->m_viewportGroup) {
271 h = d->m_viewportGroup->height();
272 d->m_viewportGroup->recalcGridSize();
273 }
274 if (d->m_popupWidget) {
275 QLayout *lay = d->m_popupWidget->layout();
276 if (!lay) {
277 return;
278 }
279 int c = lay->count();
280 for (int i = 0; i < c; ++i) {
281 QLayoutItem *item = lay->itemAt(i);
282 if (!item) {
283 continue;
284 }
285 QWidget *w = item->widget();
286 if (!w) {
287 continue;
288 }
289 RibbonGalleryGroup *g = qobject_cast<RibbonGalleryGroup *>(w);
290 if (!g) {
291 continue;
292 }
293 g->recalcGridSize(h);
294 }
295 }
296}
297
298void RibbonGallery::paintEvent(QPaintEvent *event)
299{
300 QFrame::paintEvent(event);
301}
302
303/* RibbonGalleryViewportPrivate */
304class RibbonGalleryViewportPrivate
305{
307public:
308 RibbonGalleryViewportPrivate();
309 void init();
310public:
311 QVBoxLayout *m_layout;
312 QMap<QWidget *, QLabel *> m_widgetToTitleLabel;
313};
314
315RibbonGalleryViewportPrivate::RibbonGalleryViewportPrivate()
316{
317}
318
319void RibbonGalleryViewportPrivate::init()
320{
321 Q_Q(RibbonGalleryViewport);
322 m_layout = new QVBoxLayout(q);
323 m_layout->setSpacing(2);
324 m_layout->setContentsMargins(0, 0, 0, 0);
325}
326
328 : QWidget(parent)
329{
332 d->init();
333
334 setWindowFlags(Qt::Popup);
335 QPalette pl = palette();
336 pl.setBrush(QPalette::Window, pl.brush(QPalette::Base));
337 setPalette(pl);
338}
339
344
346{
348 w->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
349 d->m_layout->addWidget(w);
350}
351
352void RibbonGalleryViewport::addWidget(QWidget *w, const QString &title)
353{
355 QLabel *label = new QLabel(this);
356 label->setText(title);
357 label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
358 label->setObjectName(QLatin1String("RibbonGalleryGroupTitle"));
359 d->m_layout->addWidget(label);
360 w->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
361 d->m_layout->addWidget(w);
362 d->m_widgetToTitleLabel[w] = label;
363}
364
366{
368 QLabel *label = getWidgetTitleLabel(w);
369 if (label) {
370 d->m_layout->removeWidget(label);
371 d->m_widgetToTitleLabel.remove(w);
372 label->hide();
373 label->deleteLater();
374 }
375 d->m_layout->removeWidget(w);
376}
377
384{
386 return d->m_widgetToTitleLabel.value(w, Q_NULLPTR);
387}
388
389void RibbonGalleryViewport::widgetTitleChanged(QWidget *w, const QString &title)
390{
391 QLabel *label = getWidgetTitleLabel(w);
392 if (label) {
393 label->setText(title);
394 }
395}
396
void triggered(QAction *action)
等同QActionGroup的triggered 所有加入RibbonGalleryGroup的action都会被一个QActionGroup管理,可以通过
void setGroupTitle(const QString &title)
void hovered(QAction *action)
等同QActionGroup的hovered 所有加入RibbonGalleryGroup的action都会被一个QActionGroup管理,可以通过
void recalcGridSize()
重新计算grid和icon的尺寸
void addItems(const QList< QAction * > &acts)
void groupTitleChanged(const QString &title)
void widgetTitleChanged(QWidget *w, const QString &title)
QLabel * getWidgetTitleLabel(QWidget *w)
通过RibbonGalleryGroup获取对应的标题,用户可以通过此函数设置QLabel的属性
virtual void onTriggered(QAction *action)
RibbonGalleryGroup * currentViewGroup() const
virtual void showMoreDetail()
显示更多触发,默认弹出内部管理的RibbonGalleryViewport,用户可重载此函数实现自定义的弹出
void triggered(QAction *action)
void hovered(QAction *action)
void paintEvent(QPaintEvent *event) override
virtual QSize sizeHint() const override
static void setGalleryButtonMaximumWidth(int w=15)
设置最右边三个控制按钮的最大宽度(默认15)
void setCurrentViewGroup(RibbonGalleryGroup *group)
void onItemClicked(const QModelIndex &index)
RibbonGalleryGroup * addGalleryGroup()
获取一个空白RibbonGalleryGroup
void resizeEvent(QResizeEvent *event) override
#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