Skip to content

Commit

Permalink
添加了AccessBar和RightBar可由用户设置iconSize的接口
Browse files Browse the repository at this point in the history
  • Loading branch information
czyt1988 committed Nov 18, 2023
1 parent b98b559 commit 0d81dd2
Show file tree
Hide file tree
Showing 4 changed files with 175 additions and 107 deletions.
90 changes: 74 additions & 16 deletions src/SARibbonBar/SARibbonBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,12 @@ class SARibbonBar::PrivateData
QList< QColor > mContextCategoryColorList; ///< contextCategory的色系
int mContextCategoryColorListIndex; ///< 记录contextCategory色系索引
QColor mTitleTextColor; ///< 标题文字颜色,默认无效,无效的情况下和SARibbonBar的qss:color属性一致
QColor mTabBarBaseLineColor; ///< tabbar 底部会绘制一条线条,定义线条颜色
Qt::Alignment mTitleAligment; ///< 标题对齐方式
bool mIsTitleVisible; ///< 标题是否显示
QColor mTabBarBaseLineColor; ///< tabbar 底部会绘制一条线条,定义线条颜色
Qt::Alignment mTitleAligment; ///< 标题对齐方式
bool mIsTitleVisible; ///< 标题是否显示
bool mEnableUserDefineAccessBarIconSize; ///< 允许用户自定义AccessBar的IconSize
bool mEnableUserDefineRightBarIconSize; ///< 允许用户自定义RightBar的IconSize
public:
PrivateData(SARibbonBar* par)
: q_ptr(par)
, mApplicationButton(nullptr)
Expand All @@ -92,6 +95,7 @@ class SARibbonBar::PrivateData
, mTabBarBaseLineColor(186, 201, 219)
, mTitleAligment(Qt::AlignCenter)
, mIsTitleVisible(true)
, mEnableUserDefineAccessBarIconSize(false)
{
mContextCategoryColorList << QColor(201, 89, 156) // 玫红
<< QColor(242, 203, 29) //
Expand Down Expand Up @@ -1367,6 +1371,52 @@ bool SARibbonBar::isTitleVisible() const
return d_ptr->mIsTitleVisible;
}

/**
@brief 设置允许用户自定义AccessBar的icon size
若设置为true此时用户调用AccessBar的setIconSize是可接受的,否则iconsize大小将由SARibbonBar计算
默认为false
@param
*/
void SARibbonBar::setEnableUserDefineAccessBarIconSize(bool on)
{
d_ptr->mEnableUserDefineAccessBarIconSize = on;
}

/**
@brief 是否允许用户自定义AccessBar的icon size
@return
*/
bool SARibbonBar::isEnableUserDefineAccessBarIconSize() const
{
return d_ptr->mEnableUserDefineAccessBarIconSize;
}

/**
@brief 是否允许用户自定义RightBar的icon size
若设置为true此时用户调用RightBar的setIconSize是可接受的,否则iconsize大小将由SARibbonBar计算
默认为false
@param on
*/
void SARibbonBar::setEnableUserDefineRightBarIconSize(bool on)
{
d_ptr->mEnableUserDefineRightBarIconSize = on;
}

/**
@brief 是否允许用户自定义RightBar的icon size
@return
*/
bool SARibbonBar::isEnableUserDefineRightBarIconSize() const
{
return d_ptr->mEnableUserDefineRightBarIconSize;
}

bool SARibbonBar::eventFilter(QObject* obj, QEvent* e)
{
if (obj) {
Expand Down Expand Up @@ -1783,10 +1833,12 @@ void SARibbonBar::resizeInOfficeStyle()
QSize quickAccessBarSize = d_ptr->mQuickAccessBar->sizeHint();
// 上下留1px的边线
d_ptr->mQuickAccessBar->setGeometry(x, y + 1, quickAccessBarSize.width(), validTitleBarHeight - 2);
// 变更iconsize
QSize btnIconSize = PrivateData::calcIconSizeByHeight(validTitleBarHeight - 2);
if (btnIconSize != d_ptr->mQuickAccessBar->iconSize()) {
d_ptr->mQuickAccessBar->setIconSize(btnIconSize);
if (!(d_ptr->mEnableUserDefineAccessBarIconSize)) { //允许用户自定义AccessBar的IconSize就不进入此条件重置大小
// 变更iconsize
QSize btnIconSize = PrivateData::calcIconSizeByHeight(validTitleBarHeight - 2);
if (btnIconSize != d_ptr->mQuickAccessBar->iconSize()) {
d_ptr->mQuickAccessBar->setIconSize(btnIconSize);
}
}
}
}
Expand Down Expand Up @@ -1829,9 +1881,11 @@ void SARibbonBar::resizeInOfficeStyle()
// 上下留1px的边线
d_ptr->mRightButtonGroup->setGeometry(endX, y + 1, wSize.width(), tabH - 2);
// 变更iconsize
QSize btnIconSize = PrivateData::calcIconSizeByHeight(tabH - 2);
if (btnIconSize != d_ptr->mRightButtonGroup->iconSize()) {
d_ptr->mRightButtonGroup->setIconSize(btnIconSize);
if (!(d_ptr->mEnableUserDefineRightBarIconSize)) {
QSize btnIconSize = PrivateData::calcIconSizeByHeight(tabH - 2);
if (btnIconSize != d_ptr->mRightButtonGroup->iconSize()) {
d_ptr->mRightButtonGroup->setIconSize(btnIconSize);
}
}
}
// 最后确定tabbar宽度
Expand Down Expand Up @@ -1875,9 +1929,11 @@ void SARibbonBar::resizeInWpsLiteStyle()
// 上下留1px的边线
d_ptr->mRightButtonGroup->setGeometry(endX, y + 1, wSize.width(), validTitleBarHeight - 2);
// 变更iconsize
QSize btnIconSize = PrivateData::calcIconSizeByHeight(validTitleBarHeight - 2);
if (btnIconSize != d_ptr->mRightButtonGroup->iconSize()) {
d_ptr->mRightButtonGroup->setIconSize(btnIconSize);
if (!(d_ptr->mEnableUserDefineRightBarIconSize)) {
QSize btnIconSize = PrivateData::calcIconSizeByHeight(validTitleBarHeight - 2);
if (btnIconSize != d_ptr->mRightButtonGroup->iconSize()) {
d_ptr->mRightButtonGroup->setIconSize(btnIconSize);
}
}
}
// quick access bar定位
Expand All @@ -1888,9 +1944,11 @@ void SARibbonBar::resizeInWpsLiteStyle()
// 上下留1px的边线
d_ptr->mQuickAccessBar->setGeometry(endX, y + 1, quickAccessBarSize.width(), validTitleBarHeight - 2);
// 变更iconsize
QSize btnIconSize = PrivateData::calcIconSizeByHeight(validTitleBarHeight - 2);
if (btnIconSize != d_ptr->mQuickAccessBar->iconSize()) {
d_ptr->mQuickAccessBar->setIconSize(btnIconSize);
if (!(d_ptr->mEnableUserDefineAccessBarIconSize)) { //允许用户自定义AccessBar的IconSize就不进入此条件重置大小
QSize btnIconSize = PrivateData::calcIconSizeByHeight(validTitleBarHeight - 2);
if (btnIconSize != d_ptr->mQuickAccessBar->iconSize()) {
d_ptr->mQuickAccessBar->setIconSize(btnIconSize);
}
}
}
}
Expand Down
189 changes: 99 additions & 90 deletions src/SARibbonBar/SARibbonBar.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,78 +15,78 @@ class SARibbonQuickAccessBar;
class SARibbonStackedWidget;

/**
* @brief SARibbonBar继承于QMenuBar,在SARibbonMainWindow中直接替换了原来的QMenuBar
*
* 通过setRibbonStyle函数设置ribbon的风格:
*
* @code
* void setRibbonStyle(RibbonStyle v);
* @endcode
*
* SARibbonBar参考office和wps,提供了四种风格的Ribbon模式,@ref SARibbonBar::RibbonStyle
*
* 如果想ribbon占用的空间足够小,WpsLiteStyleTwoRow模式能比OfficeStyle节省35%的高度空间
*
* 如何生成ribbon?先看看一个传统的Menu/ToolBar是如何生成的:
*
* @code
* void MainWindow::MainWindow()
* {
* QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
* QToolBar *fileToolBar = addToolBar(tr("File"));
* //生成action
* QAction *newAct = new QAction(newIcon, tr("&New"), this);
* fileMenu->addAction(newAct);
* fileToolBar->addAction(newAct);
*
* QAction *openAct = new QAction(openIcon, tr("&Open..."), this);
* fileMenu->addAction(openAct);
* fileToolBar->addAction(openAct);
* }
* @endcode
*
* 传统的Menu/ToolBar主要通过QMenu的addMenu添加菜单,通过QMainWindow::addToolBar生成QToolBar,
* 再把QAction设置进QMenu和QToolBar中
*
* SARibbonBar和传统方法相似,不过相对于传统的Menu/ToolBar QMenu和QToolBar是平级的,
* Ribbon是有明显的层级关系,SARibbonBar下面是 @ref SARibbonCategory,
* SARibbonCategory下面是@ref SARibbonPannel ,SARibbonPannel下面是@ref SARibbonToolButton ,
* SARibbonToolButton管理着QAction
*
* 因此,生成一个ribbon只需以下几个函数:
* @code
* SARibbonCategory * SARibbonBar::addCategoryPage(const QString& title);
* SARibbonPannel * SARibbonCategory::addPannel(const QString& title);
* SARibbonToolButton * SARibbonPannel::addLargeAction(QAction *action);
* SARibbonToolButton * SARibbonPannel::addSmallAction(QAction *action);
* @endcode
*
* 因此生成步骤如下:
*
* @code
* //成员变量
* SARibbonCategory* categoryMain;
* SARibbonPannel* FilePannel;
*
* //建立ui
* void setupRibbonUi()
* {
* ......
* //ribbonwindow为SARibbonMainWindow
* SARibbonBar* ribbon = ribbonwindow->ribbonBar();
* ribbon->setRibbonStyle(SARibbonBar::WpsLiteStyle);
* //添加一个Main标签
* categoryMain = ribbon->addCategoryPage(QStringLiteral("Main"));
* //Main标签下添加一个File Pannel
* FilePannel = categoryMain->addPannel(QStringLiteral("FilePannel"));
* //开始为File Pannel添加action
* FilePannel->addLargeAction(actionNew);
* FilePannel->addLargeAction(actionOpen);
* FilePannel->addLargeAction(actionSave);
* FilePannel->addSmallAction(actionImportMesh);
* FilePannel->addSmallAction(actionImportGeometry);
* }
* @endcode
@brief SARibbonBar继承于QMenuBar,在SARibbonMainWindow中直接替换了原来的QMenuBar
通过setRibbonStyle函数设置ribbon的风格:
@code
void setRibbonStyle(RibbonStyle v);
@endcode
SARibbonBar参考office和wps,提供了四种风格的Ribbon模式,@ref SARibbonBar::RibbonStyle
如果想ribbon占用的空间足够小,WpsLiteStyleTwoRow模式能比OfficeStyle节省35%的高度空间
如何生成ribbon?先看看一个传统的Menu/ToolBar是如何生成的:
@code
void MainWindow::MainWindow()
{
QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
QToolBar *fileToolBar = addToolBar(tr("File"));
//生成action
QAction *newAct = new QAction(newIcon, tr("&New"), this);
fileMenu->addAction(newAct);
fileToolBar->addAction(newAct);
QAction *openAct = new QAction(openIcon, tr("&Open..."), this);
fileMenu->addAction(openAct);
fileToolBar->addAction(openAct);
}
@endcode
传统的Menu/ToolBar主要通过QMenu的addMenu添加菜单,通过QMainWindow::addToolBar生成QToolBar,
再把QAction设置进QMenu和QToolBar中
SARibbonBar和传统方法相似,不过相对于传统的Menu/ToolBar QMenu和QToolBar是平级的,
Ribbon是有明显的层级关系,SARibbonBar下面是 @ref SARibbonCategory,
SARibbonCategory下面是@ref SARibbonPannel ,SARibbonPannel下面是@ref SARibbonToolButton ,
SARibbonToolButton管理着QAction
因此,生成一个ribbon只需以下几个函数:
@code
SARibbonCategory * SARibbonBar::addCategoryPage(const QString& title);
SARibbonPannel * SARibbonCategory::addPannel(const QString& title);
SARibbonToolButton * SARibbonPannel::addLargeAction(QAction *action);
SARibbonToolButton * SARibbonPannel::addSmallAction(QAction *action);
@endcode
因此生成步骤如下:
@code
//成员变量
SARibbonCategory* categoryMain;
SARibbonPannel* FilePannel;
//建立ui
void setupRibbonUi()
{
......
//ribbonwindow为SARibbonMainWindow
SARibbonBar* ribbon = ribbonwindow->ribbonBar();
ribbon->setRibbonStyle(SARibbonBar::WpsLiteStyle);
//添加一个Main标签
categoryMain = ribbon->addCategoryPage(QStringLiteral("Main"));
//Main标签下添加一个File Pannel
FilePannel = categoryMain->addPannel(QStringLiteral("FilePannel"));
//开始为File Pannel添加action
FilePannel->addLargeAction(actionNew);
FilePannel->addLargeAction(actionOpen);
FilePannel->addLargeAction(actionSave);
FilePannel->addSmallAction(actionImportMesh);
FilePannel->addSmallAction(actionImportGeometry);
}
@endcode
*/
class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar
{
Expand All @@ -104,14 +104,14 @@ class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar
*/
enum RibbonStyle
{
RibbonStyleLooseThreeRow = 0x0000, ///< 宽松结构,3行模式
RibbonStyleCompactThreeRow = 0x0001, ///< 紧凑结构,3行模式
RibbonStyleLooseTwoRow = 0x0100, ///< 宽松结构,2行模式
RibbonStyleCompactTwoRow = 0x0101, ///< 紧凑结构,2行模式
// 以下枚举将组件淘汰
OfficeStyle = RibbonStyleLooseThreeRow, ///< 类似office 的ribbon风格
WpsLiteStyle = RibbonStyleCompactThreeRow, ///< 类似wps的紧凑风格
OfficeStyleTwoRow = RibbonStyleLooseTwoRow, ///< 类似office 的ribbon风格 2行工具栏 三行布局模式,office就是三行布局模式,pannel能布置3行小toolbutton,默认模式
RibbonStyleLooseThreeRow = 0x0000, ///< 宽松结构,3行模式
RibbonStyleCompactThreeRow = 0x0001, ///< 紧凑结构,3行模式
RibbonStyleLooseTwoRow = 0x0100, ///< 宽松结构,2行模式
RibbonStyleCompactTwoRow = 0x0101, ///< 紧凑结构,2行模式
// 以下枚举将组件淘汰
OfficeStyle = RibbonStyleLooseThreeRow, ///< 类似office 的ribbon风格
WpsLiteStyle = RibbonStyleCompactThreeRow, ///< 类似wps的紧凑风格
OfficeStyleTwoRow = RibbonStyleLooseTwoRow, ///< 类似office 的ribbon风格 2行工具栏 三行布局模式,office就是三行布局模式,pannel能布置3行小toolbutton,默认模式
WpsLiteStyleTwoRow = RibbonStyleCompactTwoRow ///< 类似wps的紧凑风格 2行工具栏
};
Q_ENUM(RibbonStyle)
Expand All @@ -136,6 +136,7 @@ class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar
// 获取版本信息
static QString versionString();

public:
// 构造函数
SARibbonBar(QWidget* parent = nullptr);
~SARibbonBar() Q_DECL_OVERRIDE;
Expand Down Expand Up @@ -265,7 +266,7 @@ class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar
// 告诉saribbonbar,window button的尺寸
void setWindowButtonSize(const QSize& size);

// 更新ribbon的布局数据,此函数适用于一些关键性尺寸变化,换起ribbon下面元素的布局
// 更新ribbon的布局数据,此函数适用于一些关键性尺寸变化,换起ribbon下面元素的布局,在发现刷新问题时,可以调用此函数
void updateRibbonGeometry();
// tabbar 底部会绘制一条线条,此接口定义线条颜色
void setTabBarBaseLineColor(const QColor& clr);
Expand All @@ -276,36 +277,44 @@ class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar
// 设置标题的对齐方式
void setWindowTitleAligment(Qt::Alignment al);
Qt::Alignment windowTitleAligment() const;
// 设置按钮允许换行
// 设置按钮允许换行,注意图标大小是由文字决定的,两行文字会让图标变小,如果想图标变大,文字不换行是最好的
void setEnableWordWrap(bool on);
bool isEnableWordWrap() const;
// 获取SARibbonStackedWidget
// 获取SARibbonStackedWidget,谨慎使用此函数
SARibbonStackedWidget* ribbonStackedWidget();
// 设置是否显示标题
void setTitleVisible(bool on = false);
bool isTitleVisible() const;
//允许用户自定义AccessBar图标尺寸,默认为false
void setEnableUserDefineAccessBarIconSize(bool on = true);
bool isEnableUserDefineAccessBarIconSize() const;
//允许用户自定义RightBar图标尺寸,默认为false
void setEnableUserDefineRightBarIconSize(bool on = true);
bool isEnableUserDefineRightBarIconSize() const;
signals:

/**
* @brief 应用按钮点击响应 - 左上角的按钮,通过关联此信号触发应用按钮点击的效果
@brief 应用按钮点击响应 - 左上角的按钮,通过关联此信号触发应用按钮点击的效果
例如想点击按钮后弹出一个全屏的窗口(如office这些)
*/
void applicationButtonClicked();

/**
* @brief 标签页变化触发的信号
* @param index
@brief 标签页变化触发的信号
@param index
*/
void currentRibbonTabChanged(int index);

/**
* @brief ribbon的状态发生了变化后触发此信号
* @param nowState 变更之后的ribbon状态
@brief ribbon的状态发生了变化后触发此信号
@param nowState 变更之后的ribbon状态
*/
void ribbonModeChanged(SARibbonBar::RibbonMode nowState);

/**
* @brief ribbon的状态发生了变化后触发此信号
* @param nowStyle 变更之后的ribbon样式
@brief ribbon的状态发生了变化后触发此信号
@param nowStyle 变更之后的ribbon样式
*/
void ribbonStyleChanged(SARibbonBar::RibbonStyle nowStyle);

Expand Down
1 change: 1 addition & 0 deletions src/SARibbonBar/SARibbonQuickAccessBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class SARibbonQuickAccessBar::PrivateData
public:
SARibbonButtonGroupWidget* groupWidget { nullptr };
};

SARibbonQuickAccessBar::PrivateData::PrivateData(SARibbonQuickAccessBar* p) : q_ptr(p)
{
}
Expand Down
Loading

0 comments on commit 0d81dd2

Please sign in to comment.