11#include <QActionGroup>
14#include <QResizeEvent>
21class RibbonGalleryPrivate
25 RibbonGalleryPrivate();
28 void setViewPort(RibbonGalleryGroup *v);
29 RibbonGalleryViewport *getPopupViewPort();
31 RibbonControlButton *m_buttonUp;
32 RibbonControlButton *m_buttonDown;
33 RibbonControlButton *m_buttonMore;
34 RibbonGalleryViewport *m_popupWidget;
35 RibbonGalleryGroup *m_viewportGroup;
36 QBoxLayout *m_btnLayout;
38 static int s_galleryButtonMaximumWidth;
41int RibbonGalleryPrivate::s_galleryButtonMaximumWidth = 15;
43RibbonGalleryPrivate::RibbonGalleryPrivate()
49void RibbonGalleryPrivate::init()
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);
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);
89void RibbonGalleryPrivate::setViewPort(RibbonGalleryGroup *v)
93 m_viewportGroup =
new RibbonGalleryGroup(q);
94 m_layout->addWidget(m_viewportGroup, 1);
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();
110RibbonGalleryViewport *RibbonGalleryPrivate::getPopupViewPort()
114 m_popupWidget =
new RibbonGalleryViewport(q);
116 return m_popupWidget;
121RibbonGallery::RibbonGallery(QWidget *parent)
127 setFrameShape(QFrame::Box);
128 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
129 setMinimumWidth(200);
166 if (!title.isEmpty()) {
177 return d->m_viewportGroup;
183 d->setViewPort(group);
184 QApplication::postEvent(
this,
new QResizeEvent(size(), size()));
189 return QSize(100, 62);
198 RibbonGalleryPrivate::s_galleryButtonMaximumWidth = w;
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);
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);
232 QSize popupSize = d->m_popupWidget->sizeHint();
233 QPoint start = mapToGlobal(QPoint(0, 0));
235 int width = d->m_viewportGroup->width();
237 width += qApp->style()->pixelMetric(QStyle::PM_ScrollBarExtent);
238 d->m_popupWidget->setGeometry(start.x(), start.y(), width, popupSize.height());
239 d->m_popupWidget->show();
244 QObject *obj = sender();
249 curGroup->scrollTo(index);
250 curGroup->setCurrentIndex(index);
259 if (d->m_popupWidget && d->m_popupWidget->isVisible()) {
260 d->m_popupWidget->hide();
267 QFrame::resizeEvent(event);
269 int h = layout()->contentsRect().height();
270 if (d->m_viewportGroup) {
271 h = d->m_viewportGroup->height();
272 d->m_viewportGroup->recalcGridSize();
274 if (d->m_popupWidget) {
275 QLayout *lay = d->m_popupWidget->layout();
279 int c = lay->count();
280 for (
int i = 0; i < c; ++i) {
281 QLayoutItem *item = lay->itemAt(i);
285 QWidget *w = item->widget();
300 QFrame::paintEvent(event);
304class RibbonGalleryViewportPrivate
308 RibbonGalleryViewportPrivate();
311 QVBoxLayout *m_layout;
312 QMap<QWidget *, QLabel *> m_widgetToTitleLabel;
315RibbonGalleryViewportPrivate::RibbonGalleryViewportPrivate()
319void RibbonGalleryViewportPrivate::init()
321 Q_Q(RibbonGalleryViewport);
322 m_layout =
new QVBoxLayout(q);
323 m_layout->setSpacing(2);
324 m_layout->setContentsMargins(0, 0, 0, 0);
334 setWindowFlags(Qt::Popup);
335 QPalette pl = palette();
336 pl.setBrush(QPalette::Window, pl.brush(QPalette::Base));
348 w->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
349 d->m_layout->addWidget(w);
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;
370 d->m_layout->removeWidget(label);
371 d->m_widgetToTitleLabel.remove(w);
373 label->deleteLater();
375 d->m_layout->removeWidget(w);
386 return d->m_widgetToTitleLabel.value(w,
Q_NULLPTR);
393 label->setText(title);
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)
QString groupTitle() const
void addWidget(QWidget *w)
void widgetTitleChanged(QWidget *w, const QString &title)
RibbonGalleryViewport(QWidget *parent)
void removeWidget(QWidget *w)
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