QtCanpool 3.3.0
载入中...
搜索中...
未找到
qxnavbar.cpp
浏览该文件的文档.
1
5#include "qxnavbar.h"
6#include "qxnavbar_p.h"
8
9#include <QMenu>
10#include <QAction>
11#include <QActionEvent>
12#include <QActionGroup>
13#include <QStyle>
14
16
17QxNavBarPrivate::QxNavBarPrivate()
19 , m_actionAccessPopup(Q_NULLPTR)
20 , m_removingAction(false)
21{
22 m_actionMap.clear();
23}
24
26{
27 Q_Q(QxNavBar);
28
29 const int sz = q->style()->pixelMetric(QStyle::PM_SmallIconSize, Q_NULLPTR, q);
30 q->setIconSize(QSize(sz, sz));
31
33 connect(q, &QxNavBar::orientationChanged, m_accessPopup, &QxMenuAccessButton::setOrientation);
34 connect(q, &QxNavBar::toolButtonStyleChanged, m_accessPopup, &QxMenuAccessButton::setToolButtonStyle);
35 m_menu = new QMenu(q);
36 m_accessPopup->setMenu(m_menu);
37
38 m_actionAccessPopup = q->addWidget(m_accessPopup);
39
40 m_customizeGroup = new QActionGroup(q);
41 m_customizeGroup->setExclusive(false);
42 connect(m_customizeGroup, SIGNAL(triggered(QAction *)), this, SLOT(customizeAction(QAction *)));
43
44 connect(m_menu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowCustomizeMenu()));
45 connect(m_menu, SIGNAL(aboutToHide()), this, SLOT(aboutToHideCustomizeMenu()));
46
47 q->setAutoFillBackground(false);
48 q->setAttribute(Qt::WA_NoSystemBackground);
49 q->setTabStyle(Qt::ToolButtonTextOnly);
50}
51
53{
54 Q_Q(QxNavBar);
55 if (QAction *lowAction = m_actionMap.key(action)) {
56 lowAction->setVisible(action->isChecked());
57 Q_EMIT q->customizeTabChanged();
58 }
59}
60
62{
63 Q_Q(QxNavBar);
64 m_menu->clear();
65 foreach (QAction *action, m_actionList) {
66 m_menu->addAction(action);
67 }
68 Q_EMIT q->showCustomizeMenu(m_menu);
69}
70
75
76QxNavBar::QxNavBar(QWidget *parent)
77 : QxTabBar(new QxNavBarPrivate(), parent)
78{
79 Q_D(QxNavBar);
80 d->setPublic(this);
81 d->init();
82 setObjectName(QLatin1String("qtc_qxnavbar"));
83}
84
86{
87 // d will be detroy in ~QxTabBar()
88}
89
91{
92 Q_D(const QxNavBar);
93 return d->m_actionAccessPopup;
94}
95
97{
98 Q_D(const QxNavBar);
99 int vcnt = 0;
100 foreach (QAction *act, d->m_actionList) {
101 if (act->isChecked()) {
102 ++vcnt;
103 }
104 }
105 return vcnt;
106}
107
108void QxNavBar::actionEvent(QActionEvent *event)
109{
111 Q_D(QxNavBar);
112 QAction *lowAction = event->action();
113 if (d->m_actionAccessPopup) {
114 if (event->type() == QEvent::ActionAdded) {
115 if (!d->m_removingAction) {
116 // remove, then add back in QEvent::ActionRemoved
117 removeAction(d->m_actionAccessPopup);
118 }
119 QAction *checkAction = d->m_actionMap.value(lowAction);
120 if (lowAction != d->m_actionAccessPopup && !checkAction) {
121 int curIndex = d->m_tabs.indexOf(lowAction);
122 int cnt = d->m_tabs.count();
123 QAction *act = new QAction(lowAction->text(), this);
124 act->setCheckable(true);
125 act->setChecked(lowAction->isVisible());
126 if (curIndex + 1 == cnt) {
127 d->m_actionList.append(act);
128 } else {
129 d->m_actionList.insert(curIndex, act);
130 }
131 d->m_customizeGroup->addAction(act);
132 d->m_actionMap[lowAction] = act;
133 adjustSize();
134 } else if (checkAction) {
135 checkAction->setChecked(lowAction->isVisible());
136 }
137 } else if (event->type() == QEvent::ActionRemoved) {
138 if (lowAction == d->m_actionAccessPopup) {
139 d->m_removingAction = true;
140 addAction(d->m_actionAccessPopup);
141 d->m_removingAction = false;
142 } else {
143 QAction *act = d->m_actionMap.value(lowAction);
144 if (act) {
145 d->m_actionList.removeOne(act);
146 d->m_customizeGroup->removeAction(act);
147 d->m_actionMap.remove(lowAction);
148 delete act;
149 }
150 }
151 } else if (event->type() == QEvent::ActionChanged) {
152 if (lowAction == d->m_actionAccessPopup) {
153 d->m_accessPopup->setDefaultAction(d->m_actionAccessPopup);
154 } else if (QAction *checkAction = d->m_actionMap.value(lowAction)) {
155 checkAction->setChecked(lowAction->isVisible());
156 }
157 }
158 }
159}
160
void setOrientation(Qt::Orientation orientation)
void customizeAction(QAction *action)
Definition qxnavbar.cpp:52
void aboutToShowCustomizeMenu()
Definition qxnavbar.cpp:61
QList< QAction * > m_actionList
Definition qxnavbar_p.h:38
void aboutToHideCustomizeMenu()
Definition qxnavbar.cpp:71
QAction * m_actionAccessPopup
Definition qxnavbar_p.h:35
QActionGroup * m_customizeGroup
Definition qxnavbar_p.h:36
QxMenuAccessButton * m_accessPopup
Definition qxnavbar_p.h:37
QMap< QAction *, QAction * > m_actionMap
Definition qxnavbar_p.h:39
int visibleCount() const
Definition qxnavbar.cpp:96
QxNavBar(QWidget *parent=0)
Definition qxnavbar.cpp:76
virtual void actionEvent(QActionEvent *event)
Definition qxnavbar.cpp:108
virtual ~QxNavBar()
Definition qxnavbar.cpp:85
QAction * actionCustomizeButton() const
Definition qxnavbar.cpp:90
virtual void actionEvent(QActionEvent *event)
Definition qxtabbar.cpp:309
#define QX_APP_END_NAMESPACE
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_APP_BEGIN_NAMESPACE