8#include <QtWidgets/QButtonGroup>
9#include <QtWidgets/QToolButton>
10#include <QtWidgets/QVBoxLayout>
15static const int s_defaultIconSize = 24;
17class QxNavigationBarPrivate
21 QxNavigationBarPrivate();
24 void updateButtonIds();
26 void syncCurrentIndex();
27 QToolButton *buttonAt(
int index)
const;
29 QVBoxLayout *m_layout;
30 QButtonGroup *m_group;
31 QList<QToolButton *> m_buttons;
36QxNavigationBarPrivate::QxNavigationBarPrivate()
39 , m_iconSize(s_defaultIconSize, s_defaultIconSize)
44void QxNavigationBarPrivate::init()
48 m_layout =
new QVBoxLayout(q);
49 m_layout->setContentsMargins(2, 2, 2, 2);
50 m_layout->setSpacing(2);
52 m_layout->addStretch(1);
54 m_group =
new QButtonGroup(q);
55 m_group->setExclusive(
true);
56 QObject::connect(m_group, &QButtonGroup::idClicked, q, &QxNavigationBar::setCurrentIndex);
58 q->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
61QToolButton *QxNavigationBarPrivate::buttonAt(
int index)
const
63 if (index < 0 || index >= m_buttons.count()) {
66 return m_buttons.at(index);
69void QxNavigationBarPrivate::updateButtonIds()
71 for (
int i = 0; i < m_buttons.count(); ++i) {
72 m_group->setId(m_buttons.at(i), i);
76void QxNavigationBarPrivate::syncCurrentIndex()
81 for (
int i = 0; i < m_buttons.count(); ++i) {
82 if (m_buttons.at(i)->isChecked()) {
87 if (index == m_currentIndex) {
90 m_currentIndex = index;
91 Q_EMIT q->currentChanged(index);
94QxNavigationBar::QxNavigationBar(QWidget *parent)
96 , d_ptr(new QxNavigationBarPrivate())
98 d_ptr->setPublic(
this);
111 const int index = d->m_buttons.count();
119 if (index < 0 || index > d->m_buttons.count()) {
123 QToolButton *
button =
new QToolButton(
this);
124 button->setCheckable(
true);
125 button->setAutoRaise(
true);
126 button->setFocusPolicy(Qt::NoFocus);
127 button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
128 button->setIconSize(d->m_iconSize);
132 d->m_layout->insertWidget(index,
button);
133 d->m_buttons.insert(index,
button);
134 d->m_group->addButton(
button);
135 d->updateButtonIds();
139 d->syncCurrentIndex();
145 QToolButton *
button = d->buttonAt(index);
150 d->m_buttons.removeAt(index);
151 d->m_group->removeButton(
button);
152 d->m_layout->removeWidget(
button);
155 d->updateButtonIds();
157 d->syncCurrentIndex();
163 while (!d->m_buttons.isEmpty()) {
171 return d->m_buttons.count();
177 return d->m_currentIndex;
183 QToolButton *
button = d->buttonAt(index);
190 QToolButton *
button = d->buttonAt(index);
197 QToolButton *
button = d->buttonAt(index);
204 return d->m_iconSize;
210 return d->buttonAt(index);
216 if (index < -1 || index >= d->m_buttons.count()) {
219 if (index == d->m_currentIndex) {
223 d->m_currentIndex = index;
227 const bool exclusive = d->m_group->exclusive();
228 d->m_group->setExclusive(
false);
229 for (QToolButton *
button : d->m_buttons) {
230 button->setChecked(
false);
232 d->m_group->setExclusive(exclusive);
234 d->m_buttons.at(index)->setChecked(
true);
243 QToolButton *
button = d->buttonAt(index);
252 QToolButton *
button = d->buttonAt(index);
261 QToolButton *
button = d->buttonAt(index);
270 QToolButton *
button = d->buttonAt(index);
272 button->setToolTip(toolTip);
279 d->m_iconSize = size;
280 for (QToolButton *
button : d->m_buttons) {
281 button->setIconSize(size);
A vertical rail of exclusive, checkable entries.
int count() const
Number of entries.
int addItem(const QIcon &icon, const QString &text)
Appends an entry and returns its index.
void insertItem(int index, const QIcon &icon, const QString &text)
Inserts an entry at the given index, which may also be count().
bool isItemEnabled(int index) const
int currentIndex() const
Index of the selected entry, or -1 when nothing is selected.
~QxNavigationBar() override
QIcon itemIcon(int index) const
void setIconSize(const QSize &size)
QSize iconSize() const
Icon size shared by every entry; 24x24 by default.
void setItemEnabled(int index, bool enabled)
QToolButton * button(int index) const
The button behind the given index, for the rare case that needs to tweak something the bar does not e...
QString itemText(int index) const
void removeItem(int index)
Removes the entry at the given index; no-op when it is out of range.
void currentChanged(int index)
Emitted when the selection moves: on a click, on an explicit setCurrentIndex(), and also when an entr...
void setCurrentIndex(int index)
Selects the entry at the given index; pass -1 to clear the selection.
void setItemText(int index, const QString &text)
void clear()
Removes every entry.
void setItemToolTip(int index, const QString &toolTip)
void setItemIcon(int index, const QIcon &icon)
#define QX_APP_END_NAMESPACE
#define QX_DECLARE_PUBLIC(Class)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_APP_BEGIN_NAMESPACE
#define QX_FINI_PRIVATE()