14#include <QStylePainter>
17#include <QButtonGroup>
22class RibbonCtrlContainerPrivate
26 RibbonCtrlContainerPrivate();
29 void setWidget(QWidget *w);
30 void takeWidget(QWidget *w);
34 QLabel *m_labelPixmap;
38 Qt::Orientation m_orientation;
41RibbonCtrlContainerPrivate::RibbonCtrlContainerPrivate()
44 , m_orientation(Qt::Horizontal)
48void RibbonCtrlContainerPrivate::init()
50 Q_Q(RibbonCtrlContainer);
51 QHBoxLayout *headerLayout =
new QHBoxLayout();
52 headerLayout->setSpacing(2);
53 headerLayout->setContentsMargins(0, 0, 0, 0);
55 m_labelPixmap =
new QLabel(q);
56 m_labelPixmap->setObjectName(QLatin1String(
"logo"));
57 m_labelPixmap->setAlignment(Qt::AlignCenter);
58 headerLayout->addWidget(m_labelPixmap);
60 m_labelText =
new QLabel(q);
61 m_labelText->setObjectName(QLatin1String(
"title"));
62 headerLayout->addWidget(m_labelText);
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);
72void RibbonCtrlContainerPrivate::setWidget(QWidget *w)
74 Q_Q(RibbonCtrlContainer);
76 QWidget *oldwidget = m_widget;
77 takeWidget(oldwidget);
78 oldwidget->deleteLater();
84 if (w->parent() != q) {
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);
95void RibbonCtrlContainerPrivate::takeWidget(QWidget *w)
97 int i = m_layout->indexOf(w);
99 QLayoutItem *item = m_layout->takeAt(i);
104RibbonCtrlContainer::RibbonCtrlContainer(QWidget *parent)
126 d->m_labelPixmap->setVisible(b);
132 d->m_labelText->setVisible(b);
139 d->m_labelPixmap->setPixmap(i.pixmap(d->m_iconSize));
151 d->m_iconSize = size;
158 return d->m_iconSize;
164 d->m_labelText->setText(t);
170 return d->m_labelText->text();
188 return d->m_orientation;
199 d->m_layout->setDirection(QBoxLayout::LeftToRight);
200 d->m_labelPixmap->setAlignment(Qt::AlignCenter);
202 d->m_layout->setDirection(QBoxLayout::TopToBottom);
203 d->m_labelPixmap->setAlignment(Qt::AlignLeft);
208class RibbonGridContainerPrivate
212 RibbonGridContainerPrivate();
216 void addWidget(QWidget *widget);
218 QGridLayout *m_gridLayout;
219 QButtonGroup *m_buttonGroup;
220 int m_columnCount = 5;
221 bool m_hasReceivedEnter =
false;
224RibbonGridContainerPrivate::RibbonGridContainerPrivate()
228void RibbonGridContainerPrivate::init()
230 Q_Q(RibbonGridContainer);
232 m_gridLayout =
new QGridLayout(q);
233 m_gridLayout->setSpacing(0);
234 m_gridLayout->setContentsMargins(2, 1, 2, 1);
235 q->setLayout(m_gridLayout);
237 m_buttonGroup =
new QButtonGroup(q);
239#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
240 QObject::connect(m_buttonGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
242 QObject::connect(m_buttonGroup,
243 static_cast<void (QButtonGroup::*)(QAbstractButton *)
>(&QButtonGroup::buttonClicked),
245 q, [q](QAbstractButton *) {
246 QWidget *parWidget = q->parentWidget();
248 if (RibbonMenu *menu = qobject_cast<RibbonMenu *>(parWidget)) {
252 parWidget = parWidget->parentWidget();
257void RibbonGridContainerPrivate::updateLayout()
261void RibbonGridContainerPrivate::addWidget(QWidget *widget)
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);
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);
299 d->m_buttonGroup->addButton(
button);
309 if (d->m_columnCount == count) {
312 d->m_columnCount = count;
319 return d->m_columnCount;
326 if (!d->m_hasReceivedEnter) {
327 QWidget *parWidget = parentWidget();
329 if (
RibbonMenu *menu = qobject_cast<RibbonMenu *>(parWidget)) {
330 menu->setActiveAction(
nullptr);
333 parWidget = parWidget->parentWidget();
336 d->m_hasReceivedEnter =
true;
343 d->m_hasReceivedEnter =
false;
void setIconVisible(bool b)
void setOrientation(Qt::Orientation orientation)
virtual ~RibbonCtrlContainer()
Qt::Orientation orientation() const
void setText(const QString &t)
RibbonCtrlContainer(QWidget *parent=Q_NULLPTR)
void setIcon(const QIcon &i)
void setTitleVisible(bool b)
void setIconSize(const QSize &size)
void setWidget(QWidget *w)
virtual void leaveEvent(QEvent *event)
QAction * addAction(const QIcon &icon, const QString &text)
RibbonGridContainer(QWidget *parent=nullptr)
virtual ~RibbonGridContainer()
void addButton(QAbstractButton *button)
virtual void enterEvent(QEvent *event)
void setColumnCount(int count)
#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