diff --git a/src/SARibbonBar/SARibbonBar.cpp b/src/SARibbonBar/SARibbonBar.cpp index c4471b4..01eae46 100644 --- a/src/SARibbonBar/SARibbonBar.cpp +++ b/src/SARibbonBar/SARibbonBar.cpp @@ -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) @@ -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) // 黄 @@ -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) { @@ -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); + } } } } @@ -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宽度 @@ -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定位 @@ -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); + } } } } diff --git a/src/SARibbonBar/SARibbonBar.h b/src/SARibbonBar/SARibbonBar.h index 08545b6..b1964f0 100644 --- a/src/SARibbonBar/SARibbonBar.h +++ b/src/SARibbonBar/SARibbonBar.h @@ -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 { @@ -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) @@ -136,6 +136,7 @@ class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar // 获取版本信息 static QString versionString(); +public: // 构造函数 SARibbonBar(QWidget* parent = nullptr); ~SARibbonBar() Q_DECL_OVERRIDE; @@ -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); @@ -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); diff --git a/src/SARibbonBar/SARibbonQuickAccessBar.cpp b/src/SARibbonBar/SARibbonQuickAccessBar.cpp index 24945da..49358c5 100644 --- a/src/SARibbonBar/SARibbonQuickAccessBar.cpp +++ b/src/SARibbonBar/SARibbonQuickAccessBar.cpp @@ -15,6 +15,7 @@ class SARibbonQuickAccessBar::PrivateData public: SARibbonButtonGroupWidget* groupWidget { nullptr }; }; + SARibbonQuickAccessBar::PrivateData::PrivateData(SARibbonQuickAccessBar* p) : q_ptr(p) { } diff --git a/src/SARibbonBar/SARibbonQuickAccessBar.h b/src/SARibbonBar/SARibbonQuickAccessBar.h index 97f2c60..de98dd8 100644 --- a/src/SARibbonBar/SARibbonQuickAccessBar.h +++ b/src/SARibbonBar/SARibbonQuickAccessBar.h @@ -23,7 +23,7 @@ class SA_RIBBON_EXPORT SARibbonQuickAccessBar : public SARibbonCtrlContainer //获取内部管理的ButtonGroupWidget SARibbonButtonGroupWidget* buttonGroupWidget(); const SARibbonButtonGroupWidget* buttonGroupWidget() const; - // icon 尺寸设置 + // icon 尺寸设置 - 注意,如果要自定义iconsize,需要设置 void setIconSize(const QSize& s); QSize iconSize() const; };