原文鏈接:https://blog.csdn.net/czyt1988/article/details/113811620
https://devpress.csdn.net/gitcode/6412b1fe986c660f3cf9294a.html?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTactivity-4-108312948-blog-126431338.235^v31^pc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTactivity-4-108312948-blog-126431338.235v31pc_relevant_default_base3&utm_relevant_index=7#devmenu2
Qt 下結(jié)合SARibbon、Dock 開發(fā)Opencascade應(yīng)用的基礎(chǔ)框架
SARibbon的布局
在介紹如何使用SARibbon之前,需要首先了解SARibbon是如何布局的,在src/SARibbonBar/doc下有個(gè)ppt對(duì)Ribbon的布局進(jìn)行了介紹,本文內(nèi)容與ppt一直,增加了一些文字說明。
由于SARibbon支持四種布局模式,這四種布局模式定義在SARibbonBar的枚舉SARibbonBar::RibbonStyle,由于布局模式會(huì)影響顯示效果和實(shí)際函數(shù)調(diào)用的方法,因此有必要先對(duì)SARibbon支持的這四種布局模式進(jìn)行介紹。
SARibbon名詞定義
無論是后面介紹的wps模式還是office模式,這些專有名稱都是一致的,這些命名參考了MFC的ribbon界面類。
- Category 類別,代表一個(gè)標(biāo)簽所呈現(xiàn)的內(nèi)容,對(duì)應(yīng)SARibbonCategory
- Context Category 上下文類別,這個(gè)是一種特殊的類別,它正常不顯示,需要基于上下文判斷是否應(yīng)該顯示,最常用的就是word中插入圖片后,會(huì)有圖片修改相關(guān)的標(biāo)簽出現(xiàn),如果沒選中圖片,這個(gè)標(biāo)簽就消失,這個(gè)就是上下文類別,對(duì)應(yīng)SARibbonContextCategory
- Pannel 面板,這個(gè)是一組菜單的集合,office里面板都會(huì)有個(gè)面板標(biāo)題,顯示在面板最下方,面板之后就是工具欄按鈕(Action)
- Application Button 應(yīng)用按鈕,標(biāo)簽欄最左邊的按鈕(word就是對(duì)應(yīng)文件按鈕),這個(gè)按鈕會(huì)觸發(fā)一些特殊的頁面或菜單,對(duì)應(yīng)SARibbonApplicationButton,可以隱藏
- Quick Access Bar 快速響應(yīng)欄,位于最頂部的一個(gè)簡單工具欄,用于放置一些常用的action,對(duì)應(yīng)SARibbonQuickAccessBar
- Gallery 預(yù)覽控件,這是Ribbon最吸引眼球的控件,用直觀的圖像把功能顯示出來,甚至有些會(huì)根據(jù)上下文進(jìn)行實(shí)時(shí)渲染,典型的就是word開始標(biāo)簽下的樣式選擇,對(duì)應(yīng)SARibbonGallery
Office布局模式——SARibbonBar::OfficeStyle
此模式和Office的Ribbon樣式一致,office的word界面截圖如下
SARibbon OfficeStyle的布局如下圖所示:
這個(gè)布局和office的默認(rèn)布局是一致的
WPS布局模式——SARibbonBar::WpsLiteStyle
此模式和Office的Ribbon樣式有區(qū)別,參考了WPS的ribbon界面做法,把office ribbon較占空間的標(biāo)題欄進(jìn)行利用,實(shí)現(xiàn)了界面的最大利用,這個(gè)模式下可以減少一個(gè)標(biāo)題欄的高度,WPS模式截圖如下:
這個(gè)圖時(shí)WPS對(duì)ribbon的第一次更改,wps對(duì)ribbon的第二次改動(dòng),在行數(shù)這一節(jié)會(huì)有介紹
wps模式布局:
pannel的布局
在標(biāo)準(zhǔn)的pannel中,一個(gè)action(按鈕)有3種布局,以office word為例,pannel的三種布局其實(shí)是所占行數(shù):
第一種,占滿整個(gè)pannel,只有一行,稱之為large
第二種,一個(gè)pannel下放置兩行,稱之為medium
第三種,一個(gè)pannel放置3行內(nèi)容,稱之為samll
因此,pannel的布局其實(shí)歸根結(jié)底就是行數(shù),SARibbon一開始是用QGridLayout來對(duì)pannel進(jìn)行布局的,把grid分割為6行,large模式下占全部6行,medium模式下占據(jù)3行,small模式下占據(jù)2行,后續(xù)參考QToolBar的源碼,重新實(shí)現(xiàn)了pannel的自定義布局。
行數(shù)
上一節(jié)講到了pannel的布局,pannel布局一個(gè)很關(guān)鍵的點(diǎn)就是行的概念,行的不同定義,會(huì)影響整個(gè)顯示效果。
在高版本的wps中,為了進(jìn)一步縮減ribbon bar的高度,把ribbon的3行按鈕改為了2個(gè),這樣使得ribbon bar進(jìn)一步縮減,對(duì)應(yīng)action不多的category顯得會(huì)更飽滿,相當(dāng)于只有medium,沒有small模式。這是WPS對(duì)ribbon的第二次布局更改,新版WPS的截圖如下:
通過這個(gè)改動(dòng),機(jī)智挖掘了ribbon的高度,SARibbon支持這幾種ribbon樣式,引入了行數(shù)的概念,在SARibbonBar::RibbonStyle的枚舉中帶TwoRow結(jié)尾的都是指代2行模式。
/**
* @brief 定義ribbon的風(fēng)格,第一字節(jié)代表樣式,第二字節(jié)代表是否是2行
*/
enum RibbonStyle {
OfficeStyle = 0x0000 ///< 類似office 的ribbon風(fēng)格
, WpsLiteStyle = 0x0001 ///< 類似wps的緊湊風(fēng)格
, OfficeStyleTwoRow = 0x0100 ///< 類似office 的ribbon風(fēng)格 2行工具欄 三行布局模式,office就是三行布局模式,pannel能布置3行小toolbutton,默認(rèn)模式
, WpsLiteStyleTwoRow = 0x0101 ///< 類似wps的緊湊風(fēng)格 2行工具欄
};
枚舉SARibbonPannelItem::RowProportion是為了表征每個(gè)窗體在pannel所占行數(shù)的情況,在pannel布局中會(huì)常用到,這個(gè)枚舉定義如下:
/**
* @brief 定義了行的占比,ribbon中有l(wèi)arge,media和small三種占比
*/
enum RowProportion {
None ///< 為定義占比,這時(shí)候?qū)?huì)依據(jù)expandingDirections來判斷,如果能有Qt::Vertical,就等同于Large,否則就是Small
, Large ///< 大占比,一個(gè)widget的高度會(huì)充滿整個(gè)pannel
, Medium ///< 中占比,在@ref SARibbonPannel::pannelLayoutMode 為 @ref SARibbonPannel::ThreeRowMode 時(shí)才會(huì)起作用,且要同一列里兩個(gè)都是Medium時(shí),會(huì)在三行中占據(jù)兩行
, Small ///< 小占比,占SARibbonPannel的一行,Medium在不滿足條件時(shí)也會(huì)變?yōu)镾mall,但不會(huì)變?yōu)長arge
};
SARibbonPannel里管理的每個(gè)action都會(huì)帶有一個(gè)占位的屬性(SARibbonPannelItem::RowProportion),這個(gè)占位屬性決定了這個(gè)action在pannel里的布局。
下面針對(duì)不同行數(shù)進(jìn)行詳細(xì)介紹。
3行模式
三行模式是傳統(tǒng)的pannel布局方式,如下圖所示:
3行模式下有三種占位(SARibbonPannelItem::RowProportion),分別為large、medium和small
- large大占比,一個(gè)widget的高度會(huì)充滿整個(gè)pannel
- medium中占比,pannel里一列放置2個(gè)窗體,前提是這一列2個(gè)都是medium,否則會(huì)顯示異常(暫時(shí)還未做medium條件降級(jí)到small的處理,后續(xù)會(huì)實(shí)現(xiàn))
- small小占比,pannel里一列放置3個(gè)窗體
3行模式下的pannel會(huì)顯示pannel的標(biāo)題在Pannel Title區(qū)域,另外還有一個(gè)OptionAction的區(qū)域,這個(gè)是給這個(gè)action添加特殊觸發(fā)使用的,如果沒有設(shè)置OptionAction,這個(gè)區(qū)域是隱藏。
三行模式最經(jīng)典的布局就是word:
2行模式
兩行模式是傳統(tǒng)的WPS的改進(jìn)布局法(具體是否是WPS首先這樣做的不清楚,我是按照WPS的布局進(jìn)行參考的),如下圖所示:
2行模式下medium和small占位(SARibbonPannelItem::RowProportion)是一樣的,不做區(qū)分。
另外兩行模式下pannel是不顯示標(biāo)題的。
2行模式是按照WPS的2020進(jìn)行參考編寫的,WPS2020的截圖如下:
測試案例
在*.pro文件中添加自己的庫路徑
INCLUDEPATH += $$PWD/lib/SARibbonBar_include/.
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAction>
#include <QMessageBox>
#include "SARibbonMainWindow.h"
#include "SARibbonBar.h"
#include "SARibbonCategory.h"
#include "SARibbonCategoryLayout.h"
#include "SARibbonPannel.h"
#include "SARibbonToolButton.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public SARibbonMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: SARibbonMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
SARibbonBar *ribbon = ribbonBar();
ribbon->setRibbonStyle(SARibbonBar::RibbonStyle::OfficeStyle);
ribbon->setFont(QFont("微軟雅黑", 12));
ribbon->applicationButton()->setVisible(true);
//創(chuàng)建SARibbonCategory實(shí)例
SARibbonCategory *categoryMain = new SARibbonCategory();
categoryMain->setCategoryName("Category1");
categoryMain->setObjectName("categoryMain");
categoryMain->setFont(QFont("微軟雅黑", 12));
ribbon->addCategoryPage(categoryMain);
SARibbonCategory *categoryMain2 = new SARibbonCategory();
categoryMain2->setCategoryName("Category2");
categoryMain2->setObjectName("categoryMain2");
categoryMain2->setFont(QFont("微軟雅黑", 12));
ribbon->addCategoryPage(categoryMain2);
//創(chuàng)建SARibbonPannel實(shí)例
SARibbonPannel *pannel = categoryMain->addPannel("pannel1");
// QAction *action1 = new QAction("動(dòng)作1");
QAction *action1 = new QAction(QIcon(":/prefix1/bing.ico"), tr("動(dòng)作1"));
pannel->addLargeAction(action1);
QAction *action2 = new QAction(QIcon(":/prefix1/kinventorymgr.ico"), tr("動(dòng)作2"));
pannel->addLargeAction(action2);
//創(chuàng)建SARibbonPannel實(shí)例
SARibbonPannel *pannel2 = categoryMain2->addPannel("pannel2");
QAction *action2_1 = new QAction(QIcon(":/prefix1/qq.ico"), tr("動(dòng)作2_1"));
pannel2->addLargeAction(action2_1);
QAction *action2_2 = new QAction(QIcon(":/prefix1/wpsbox_sharefolder.ico"), tr("動(dòng)作2_2"));
pannel2->addLargeAction(action2_2);
//創(chuàng)建SARibbonPannel實(shí)例
SARibbonPannel *pannel1_2 = categoryMain->addPannel("pannel1_2");
QAction *action1_2 = new QAction(QIcon(":/prefix1/sync.ico"), tr("動(dòng)作1_2"));
pannel1_2->addLargeAction(action1_2);
QAction *action1_3 = new QAction(QIcon(":/prefix1/print_property.ico"), tr("動(dòng)作1_3"));
pannel1_2->addLargeAction(action1_3);
connect(action1, &QAction::triggered, this, [=]{
QMessageBox::information(this,"action1消息提示", "這是一條消息提示內(nèi)容");
// categoryMain2->setVisible(true);
ribbon->showCategory(categoryMain2);
// pannel2->setVisible(true);
action2_1->setVisible(true);
});
connect(action2_2, &QAction::triggered, this, [=]{QMessageBox::information(this,"action2_2消息提示", "這是一條消息提示內(nèi)容");});
connect(action2, &QAction::triggered, this, [=]{
// pannel2->setVisible(false);
action2_1->setVisible(false);
ribbon->hideCategory(categoryMain2);
});
}
MainWindow::~MainWindow()
{
delete ui;
}
特別注意
使用UI方式生成MainWindow,切記:刪除MainWindow.ui的工具欄。
使用代碼方式生成MainWindow,不要加載菜單欄實(shí)例。
文章來源:http://www.zghlxwxcb.cn/news/detail-824578.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-824578.html
到了這里,關(guān)于開源Qt Ribbon控件——SARibbon的布局思路及介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!