SARibbon 2.5.1
SARibbon wiki
载入中...
搜索中...
未找到
SARibbonBar.h
1#ifndef SARIBBONBAR_H
2#define SARIBBONBAR_H
3#include "SARibbonCategory.h"
4#include "SARibbonContextCategory.h"
5#include "SARibbonGlobal.h"
6#include <QMenuBar>
7#include <QScopedPointer>
8#include <QVariant>
9
10class QAction;
11class QAbstractButton;
13class SARibbonTabBar;
18
93class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar
94{
95 Q_OBJECT
96 SA_RIBBON_DECLARE_PRIVATE(SARibbonBar)
97 friend class SARibbonMainWindow;
98 friend class SARibbonSystemButtonBar;
99 Q_PROPERTY(RibbonStyles ribbonStyle READ currentRibbonStyle WRITE setRibbonStyle)
100 Q_PROPERTY(bool minimumMode READ isMinimumMode WRITE setMinimumMode)
101 Q_PROPERTY(bool minimumModeButton READ haveShowMinimumModeButton WRITE showMinimumModeButton)
102 Q_PROPERTY(QColor windowTitleTextColor READ windowTitleTextColor WRITE setWindowTitleTextColor)
103 Q_PROPERTY(QColor tabBarBaseLineColor READ tabBarBaseLineColor WRITE setTabBarBaseLineColor)
104 Q_PROPERTY(Qt::Alignment windowTitleAligment READ windowTitleAligment WRITE setWindowTitleAligment)
105 Q_PROPERTY(bool enableWordWrap READ isEnableWordWrap WRITE setEnableWordWrap)
106 Q_PROPERTY(bool enableShowPanelTitle READ isEnableShowPanelTitle WRITE setEnableShowPanelTitle)
107 Q_PROPERTY(bool tabOnTitle READ isTabOnTitle WRITE setTabOnTitle)
108 Q_PROPERTY(SARibbonPanel::PanelLayoutMode panelLayoutMode READ panelLayoutMode WRITE setPanelLayoutMode)
109
110public:
112 {
113 RibbonStyleLoose = 0x0001, // bit:0000 0001
114 RibbonStyleCompact = 0x0002, // bit:0000 0010
115 RibbonStyleThreeRow = 0x0010, // bit:0001 0000
116 RibbonStyleTwoRow = 0x0020, // bit:0010 0000
117
118 RibbonStyleLooseThreeRow = RibbonStyleLoose | RibbonStyleThreeRow,
119 RibbonStyleCompactThreeRow = RibbonStyleCompact | RibbonStyleThreeRow,
120 RibbonStyleLooseTwoRow = RibbonStyleLoose | RibbonStyleTwoRow,
121 RibbonStyleCompactTwoRow = RibbonStyleCompact | RibbonStyleTwoRow
122 };
123 Q_ENUM(RibbonStyleFlag)
124 Q_DECLARE_FLAGS(RibbonStyles, RibbonStyleFlag)
125 Q_FLAG(RibbonStyles)
126
127
131 {
133 NormalRibbonMode
134 };
135 Q_ENUM(RibbonMode)
136public:
137 using FpCategoryIterate = std::function< bool(SARibbonCategory*) >;
138 using FpPanelIterate = SARibbonCategory::FpPanelIterate;
142 using FpContextCategoryHighlight = std::function< QColor(const QColor&) >;
143
144public:
145 // 判断RibbonStyle是否为2行模式
146 static bool isTwoRowStyle(RibbonStyles s);
147 static bool isThreeRowStyle(RibbonStyles s);
148 // 判断是否是office样式
149 static bool isLooseStyle(RibbonStyles s);
150 static bool isCompactStyle(RibbonStyles s);
151 // 获取版本信息
152 static QString versionString();
153
154 // 获取默认的上下文标签颜色列表
155 static QList< QColor > defaultContextCategoryColorList();
156
157 // 初始化高分辨率适配
158 static void initHighDpi();
159
160public:
161 // 构造函数
162 explicit SARibbonBar(QWidget* parent = nullptr);
163 ~SARibbonBar();
164 // 获取applicationButton
165 QAbstractButton* applicationButton();
166
167 // 设置applicationButton
168 void setApplicationButton(QAbstractButton* btn);
169
170 // 获取tabbar
171 SARibbonTabBar* ribbonTabBar();
172
173 // 添加一个标签
174 SARibbonCategory* addCategoryPage(const QString& title);
175 void addCategoryPage(SARibbonCategory* category);
176
177 // 为了支持Qt designer,添加的一个重载函数
178 Q_INVOKABLE void addCategoryPage(QWidget* category);
179
180 // 添加一个category,category的位置在index,如果当前category数量少于index,将插入到最后
181 SARibbonCategory* insertCategoryPage(const QString& title, int index);
182 void insertCategoryPage(SARibbonCategory* category, int index);
183
184 // 通过名字查找Category
185 SARibbonCategory* categoryByName(const QString& title) const;
186
187 // 通过ObjectName查找Category
188 SARibbonCategory* categoryByObjectName(const QString& objname) const;
189
190 // 通过索引找到category,如果超过索引范围,会返回nullptr
191 SARibbonCategory* categoryByIndex(int index) const;
192
193 // 隐藏category,并不会删除或者取走,只是隐藏
194 void hideCategory(SARibbonCategory* category);
195
196 // 显示被隐藏的category
197 void showCategory(SARibbonCategory* category);
198
199 // 判断这个category是否在显示状态,也就是tabbar有这个category
200 bool isCategoryVisible(const SARibbonCategory* c) const;
201
202 // 获取category的索引
203 int categoryIndex(const SARibbonCategory* c) const;
204
205 // 移动一个Category从from index到to index
206 void moveCategory(int from, int to);
207
208 // 获取当前显示的所有的SARibbonCategory,包含未显示的SARibbonContextCategory的SARibbonCategory也一并返回
209 QList< SARibbonCategory* > categoryPages(bool getAll = true) const;
210
211 // 移除SARibbonCategory
212 void removeCategory(SARibbonCategory* category);
213
214 // 添加一个上下文标签
216 addContextCategory(const QString& title, const QColor& color = QColor(), const QVariant& id = QVariant());
217 void addContextCategory(SARibbonContextCategory* context);
218
219 // 显示一个上下文标签
220 void showContextCategory(SARibbonContextCategory* context);
221
222 // 隐藏一个上下文标签
223 void hideContextCategory(SARibbonContextCategory* context);
224
225 // 判断上下文是否是在显示状态
226 bool isContextCategoryVisible(SARibbonContextCategory* context);
227
228 // 设置上下文标签的显示或隐藏
229 void setContextCategoryVisible(SARibbonContextCategory* context, bool visible);
230
231 // 获取所有的上下文标签
232 QList< SARibbonContextCategory* > contextCategoryList() const;
233
234 // 移除ContextCategory
235 void destroyContextCategory(SARibbonContextCategory* context);
236
237 // 获取当前可见的上下文标签的tab索引
238 QList< int > currentVisibleContextCategoryTabIndexs() const;
239
240 // 设置为隐藏模式
241 void setMinimumMode(bool isHide);
242
243 // 当前Ribbon是否是隐藏模式
244 bool isMinimumMode() const;
245
246 // 设置显示隐藏ribbon按钮
247 void showMinimumModeButton(bool isShow = true);
248
249 // 是否显示隐藏ribbon按钮
250 bool haveShowMinimumModeButton() const;
251
252 // 隐藏ribbon对应的action
253 QAction* minimumModeAction() const;
254
255 // tab双击后最小化ribbon
256 bool isEnableTabDoubleClickToMinimumMode() const;
257 void setTabDoubleClickToMinimumMode(bool on = true) const;
258
259 // 当前的模式
260 RibbonMode currentRibbonState() const;
261
262 // ribbon tab的高度
263 int tabBarHeight() const;
264 void setTabBarHeight(int h, bool resizeByNow = true);
265
266 // 标题栏的高度
267 int titleBarHeight() const;
268 void setTitleBarHeight(int h, bool resizeByNow = true);
269
270 // category的高度
271 int categoryHeight() const;
272 void setCategoryHeight(int h, bool resizeByNow = true);
273
274 // 获取正常模式下的mainBar的高度
275 int normalModeMainBarHeight() const;
276
277 // 最小模式下的MainBar高度
278 int minimumModeMainBarHeight() const;
279
280 // 激活tabbar右边的按钮群
281 SARibbonButtonGroupWidget* activeRightButtonGroup();
282
283 // 右侧按钮群
284 SARibbonButtonGroupWidget* rightButtonGroup();
285
286 // 激活QuickAccessBar
287 SARibbonQuickAccessBar* activeQuickAccessBar();
288
289 // 快速响应栏
290 SARibbonQuickAccessBar* quickAccessBar();
291
292 // 标题栏窗口
293 SARibbonTitleIconWidget* titleIconWidget();
294
295 // 设置ribbon的风格
296 void setRibbonStyle(RibbonStyles v);
297 RibbonStyles currentRibbonStyle() const;
298
299 // 设置当前ribbon的index
300 void setCurrentIndex(int index);
301
302 // 返回当前的tab索引
303 int currentIndex();
304
305 // 确保标签显示出来
306 void raiseCategory(SARibbonCategory* category);
307
308 // 判断当前的行数
309 bool isTwoRowStyle() const;
310 bool isThreeRowStyle() const;
311
312 // 判断当前的样式
313 bool isLooseStyle() const;
314 bool isCompactStyle() const;
315
316 // 更新ribbon的布局数据,此函数适用于一些关键性尺寸变化,换起ribbon下面元素的布局,在发现刷新问题时,可以调用此函数
317 void updateRibbonGeometry();
318
319 // 设置panel的模式
320 SARibbonPanel::PanelLayoutMode panelLayoutMode() const;
321 void setPanelLayoutMode(SARibbonPanel::PanelLayoutMode m);
322
323 // 设置tab在title上面,这样可以省略title区域
324 void setTabOnTitle(bool on);
325 bool isTabOnTitle() const;
326
327 // tabbar 底部会绘制一条线条,此接口定义线条颜色
328 void setTabBarBaseLineColor(const QColor& clr);
329 QColor tabBarBaseLineColor() const;
330
331 // 设置标题颜色
332 void setWindowTitleTextColor(const QColor& clr);
333 QColor windowTitleTextColor() const;
334
335 // 设置是否显示标题
336 void setTitleVisible(bool on = false);
337 bool isTitleVisible() const;
338
339 // 设置标题的背景颜色
340 void setWindowTitleBackgroundBrush(const QBrush& bk);
341 QBrush windowTitleBackgroundBrush() const;
342
343 // 设置标题的对齐方式
344 void setWindowTitleAligment(Qt::Alignment al);
345 Qt::Alignment windowTitleAligment() const;
346
347 // 设置按钮允许换行,注意图标大小是由文字决定的,两行文字会让图标变小,如果想图标变大,文字不换行是最好的
348 void setEnableWordWrap(bool on);
349 bool isEnableWordWrap() const;
350
351 // 按钮的最大宽高比,这个系数决定按钮的最大宽度
352 void setButtonMaximumAspectRatio(qreal fac = 1.4);
353 qreal buttonMaximumAspectRatio() const;
354
355 // 设置panel的标题栏高度
356 int panelTitleHeight() const;
357 void setPanelTitleHeight(int h);
358
359 // 设置panel是否显示标题栏
360 bool isEnableShowPanelTitle() const;
361 void setEnableShowPanelTitle(bool on);
362
363 // 设置panel的spacing
364 void setPanelSpacing(int n);
365 int panelSpacing() const;
366
367 // 设置panel按钮(panel右下角的功能按钮)的icon尺寸
368 void setPanelToolButtonIconSize(const QSize& s);
369 QSize panelToolButtonIconSize() const;
370
371 // 获取SARibbonStackedWidget,谨慎使用此函数
372 SARibbonStackedWidget* ribbonStackedWidget();
373
374 // 上下文标签的颜色列表,上下文标签显示的时候,会从颜色列表中取颜色进行标签的渲染
375 void setContextCategoryColorList(const QList< QColor >& cls);
376 QList< QColor > contextCategoryColorList() const;
377
378 // 设置context category 标题的文字颜色
379 void setContextCategoryTitleTextColor(const QColor& clr);
380 QColor contextCategoryTitleTextColor() const;
381
382 // 设置上下文标签颜色的高亮方法
383 void setContextCategoryColorHighLight(FpContextCategoryHighlight fp);
384
385 // 设置ribbon的对齐方式
386 void setRibbonAlignment(SARibbonAlignment al);
387 SARibbonAlignment ribbonAlignment() const;
388
389 // 此函数会遍历SARibbonBar下的所有Category,执行函数指针(bool(SARibbonCategory*)),函数指针返回false则停止迭代
390 bool iterateCategory(FpCategoryIterate fp) const;
391 // 此函数会遍历SARibbonBar下的所有Category,并迭代所有的panel,执行函数指针(bool(SARibbonPanel*)),函数指针返回false则停止迭代
392 bool iteratePanel(FpPanelIterate fp) const;
393
394 // 设置边角widget可见性,对于mdi窗口,会出现TopLeftCorner和TopRightCorner两个corner widget
395 void setCornerWidgetVisible(bool on, Qt::Corner c = Qt::TopLeftCorner);
396
397 // 获取所有panel下的action
398 QList< QAction* > allActions() const;
399 // 当前是否使用的无边框
400 bool isUseRibbonFrame() const;
401Q_SIGNALS:
402
409
414 void currentRibbonTabChanged(int index);
415
421
426 void ribbonStyleChanged(SARibbonBar::RibbonStyles nowStyle);
427
433 void titleBarHeightChanged(int oldHeight, int newHeight);
434
439 void actionTriggered(QAction* action);
440
441protected:
442 bool eventFilter(QObject* obj, QEvent* e) override;
443 // 根据情况重置tabbar的宽度,主要针对wps模式
444 int calcMinTabBarWidth() const;
445 // 更新
446 void updateCategoryTitleToTabName();
447 // 告知WindowButtonGroup的尺寸
448 void setSystemButtonGroupSize(const QSize& s);
449 // 设置当前的MainWindow的样式,这个函数是SARibbonMainWindow调用,告知ribbonbar当前MainWindow的样式
450 void setMainWindowStyles(SARibbonMainWindowStyles s);
451protected Q_SLOTS:
452 void onWindowTitleChanged(const QString& title);
453 void onWindowIconChanged(const QIcon& i);
454 void onCategoryWindowTitleChanged(const QString& title);
455 void onStackWidgetHided();
456 virtual void onCurrentRibbonTabChanged(int index);
457 virtual void onCurrentRibbonTabClicked(int index);
458 virtual void onCurrentRibbonTabDoubleClicked(int index);
459 void onContextsCategoryPageAdded(SARibbonCategory* category);
460 void onContextsCategoryCategoryNameChanged(SARibbonCategory* category, const QString& title);
461 void onTabMoved(int from, int to);
462
463private:
464 int tabIndex(SARibbonCategory* obj);
465 void paintInLooseStyle();
466 void paintInCompactStyle();
467
468 // 刷新所有ContextCategoryManagerData,这个在单独一个Category删除时调用
469 void updateContextCategoryManagerData();
470 void synchronousCategoryData(bool autoUpdate = true);
471 // 把窗口标题文字转换为显示的文字,这里主要针对[*]占位符进行替换
472 QString toDisplayTitleText(const QString& title) const;
473 // 获取标题显示的区域
474 QRect getWindowTitleRect() const;
475
476protected:
477 void setRibbonMainwindowStyle();
478 virtual void paintEvent(QPaintEvent* e) override;
479 virtual void moveEvent(QMoveEvent* e) override;
480 virtual void changeEvent(QEvent* e) override;
481
482 virtual void paintTabbarBaseLine(QPainter& painter);
483 virtual void paintWindowTitle(QPainter& painter, const QString& title, const QRect& titleRegion);
484 virtual void
485 paintContextCategoryTab(QPainter& painter, const QString& title, const QRect& contextRect, const QColor& color);
486#if SA_DEBUG_PRINT_SARIBBONBAR
487 SA_RIBBON_EXPORT friend QDebug operator<<(QDebug debug, const SARibbonBar& ribbon);
488#endif
489};
490Q_DECLARE_OPERATORS_FOR_FLAGS(SARibbonBar::RibbonStyles)
491
492#endif // SARIBBONBAR_H
SARibbonBar继承于QMenuBar,在SARibbonMainWindow中直接替换了原来的QMenuBar
Definition SARibbonBar.h:94
RibbonMode
定义当前ribbon 的状态
Definition SARibbonBar.h:131
@ MinimumRibbonMode
缩小模式
Definition SARibbonBar.h:132
void ribbonStyleChanged(SARibbonBar::RibbonStyles nowStyle)
ribbon的状态发生了变化后触发此信号
void ribbonModeChanged(SARibbonBar::RibbonMode nowState)
ribbon的状态发生了变化后触发此信号
std::function< QColor(const QColor &) > FpContextCategoryHighlight
这是针对上下文标签的高亮颜色绘制,用户可以设置一个函数指针,来针对上下文标签的高亮颜色进行调整
Definition SARibbonBar.h:142
void titleBarHeightChanged(int oldHeight, int newHeight)
标题栏高度发生了变化的信号
void currentRibbonTabChanged(int index)
标签页变化触发的信号
void actionTriggered(QAction *action)
参考QToolBar::actionTriggered的信号
RibbonStyleFlag
Definition SARibbonBar.h:112
void applicationButtonClicked()
应用按钮点击响应 - 左上角的按钮,通过关联此信号触发应用按钮点击的效果
用于管理一组Action,类似于QToolBar
Definition SARibbonButtonGroupWidget.h:11
Ribbon控件中的分类选项卡页面(Category)
Definition SARibbonCategory.h:66
管理上下文标签的类
Definition SARibbonContextCategory.h:11
SARibbon的子元素创建的工厂,SARibbon内部创建子元素都通过SARibbonElementFactory来创建
Definition SARibbonElementFactory.h:34
如果要使用SARibbonBar,必须使用此类代替QMainWindow
Definition SARibbonMainWindow.h:60
PanelLayoutMode
Layout mode for the panel / 面板的布局模式
Definition SARibbonPanel.h:109
Ribbon quick access toolbar in the top left corner/ribbon左上顶部的快速响应栏
Definition SARibbonQuickAccessBar.h:46
具有弹出式菜单功能的堆叠窗口部件
Definition SARibbonStackedWidget.h:23
窗口的最大最小化按钮
Definition SARibbonSystemButtonBar.h:27
The SARibbonTabBar class
Definition SARibbonTabBar.h:11
Ribbon风格的标题栏图标控件 模拟Windows原生窗口左上角的程序图标功能,支持右键菜单和窗口控制操作
Definition SARibbonTitleIconWidget.h:13