From 51e37ceba06212706bdb58c4fefdbd0cf9ed57ad Mon Sep 17 00:00:00 2001 From: czyt1988 Date: Tue, 16 Jul 2024 00:16:35 +0800 Subject: [PATCH] =?UTF-8?q?v2.2.0=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changlog.md | 6 + src/SARibbon.cpp | 121 +++++++---- src/SARibbon.h | 336 ++++++++++++++++--------------- src/SARibbonBar/SARibbonGlobal.h | 2 +- 4 files changed, 259 insertions(+), 206 deletions(-) diff --git a/changlog.md b/changlog.md index 1e9c039..49d8160 100644 --- a/changlog.md +++ b/changlog.md @@ -1,5 +1,11 @@ # 版本记录(change log): +## 2024-07-15 -> 2.2.0 +- 增加了mdi窗口的示例 +- 增加了SARibbonTabBar的tab尺寸计算方式,可以让tab高度按照tabbar高度自动调整 +- 示例增加了尺寸设置的配置,可以任意调整titlebar,tabbar,pannel title height的高度 +- 修正调整category高度后,pannel高度不跟着改变的问题 +- 添加snap layout的开关,在依赖qwk下,可以设置是否开启snap layout ## 2024-05-23 -> 2.1.0 - 添加actionTriggered信号 diff --git a/src/SARibbon.cpp b/src/SARibbon.cpp index 84fa24c..4d42bec 100644 --- a/src/SARibbon.cpp +++ b/src/SARibbon.cpp @@ -1,4 +1,4 @@ -// 定义此宏,将SA_RIBBON_EXPORT定义为空 +// 定义此宏,将SA_RIBBON_EXPORT定义为空 #ifndef SA_RIBBON_BAR_NO_EXPORT #define SA_RIBBON_BAR_NO_EXPORT #endif @@ -2299,7 +2299,7 @@ class SARibbonSystemButtonBar::PrivateData par->connect(buttonMinimize, &QAbstractButton::clicked, par, &SARibbonSystemButtonBar::minimizeWindow); } else { if (buttonMinimize) { - delete buttonMinimize; + buttonMinimize->deleteLater(); buttonMinimize = nullptr; } } @@ -2324,7 +2324,8 @@ class SARibbonSystemButtonBar::PrivateData par->connect(buttonMaximize, &QAbstractButton::clicked, par, &SARibbonSystemButtonBar::maximizeWindow); } else { if (buttonMaximize) { - delete buttonMaximize; + buttonMaximize->deleteLater(); + ; buttonMaximize = nullptr; } } @@ -2349,7 +2350,8 @@ class SARibbonSystemButtonBar::PrivateData buttonClose->show(); } else { if (buttonClose) { - delete buttonClose; + buttonClose->deleteLater(); + ; buttonClose = nullptr; } } @@ -2744,8 +2746,7 @@ namespace SA QDebug operator<<(QDebug debug, const QStyleOptionToolButton& opt) { - debug << "==============" - << "\nQStyleOption(" << (QStyleOption)opt << ")" + debug << "==============" << "\nQStyleOption(" << (QStyleOption)opt << ")" << "\n QStyleOptionComplex:" "\n subControls(" << opt.subControls @@ -5219,6 +5220,8 @@ void SARibbonStackedWidget::resizeEvent(QResizeEvent* e) /*** End of inlined file: SARibbonStackedWidget.cpp ***/ /*** Start of inlined file: SARibbonSeparatorWidget.cpp ***/ +#include +#include #include #include #include @@ -5227,15 +5230,15 @@ SARibbonSeparatorWidget::SARibbonSeparatorWidget(QWidget* parent) : QFrame(paren { setFrameShape(QFrame::VLine); setFrameShadow(QFrame::Plain); - setLineWidth(1); - setMidLineWidth(1); -} -QSize SARibbonSeparatorWidget::sizeHint() const -{ - QSize sh = QFrame::sizeHint(); - sh.setWidth(1); - return sh; + if (QScreen* screen = QApplication::primaryScreen()) { + qreal dpr = screen->physicalDotsPerInch() / screen->logicalDotsPerInch(); + int scaledLineWidth = qRound(1.0 * dpr); // 假设基础 lineWidth 是 1 + setLineWidth(scaledLineWidth); + // qDebug() << "SARibbonSeparatorWidget:" << scaledLineWidth; + } else { + setLineWidth(1); + } } /*** End of inlined file: SARibbonSeparatorWidget.cpp ***/ @@ -5506,6 +5509,9 @@ QSize SARibbonQuickAccessBar::iconSize() const /*** End of inlined file: SARibbonQuickAccessBar.cpp ***/ /*** Start of inlined file: SARibbonTabBar.cpp ***/ +#include +#include + SARibbonTabBar::SARibbonTabBar(QWidget* parent) : QTabBar(parent), m_tabMargin(6, 0, 0, 0) { setExpanding(false); @@ -5521,6 +5527,35 @@ void SARibbonTabBar::setTabMargin(const QMargins& tabMargin) m_tabMargin = tabMargin; } +QSize SARibbonTabBar::tabSizeHint(int index) const +{ + QStyleOptionTab opt; + initStyleOption(&opt, index); + int hframe = style()->pixelMetric(QStyle::PM_TabBarTabHSpace, &opt, this); + const QFontMetrics fm = fontMetrics(); + + int widgetWidth = 0; + int padding = 0; + if (!opt.leftButtonSize.isEmpty()) { + padding += 4; + widgetWidth += opt.leftButtonSize.width(); + } + if (!opt.rightButtonSize.isEmpty()) { + padding += 4; + widgetWidth += opt.rightButtonSize.width(); + } + if (!opt.icon.isNull()) { + padding += 4; + } + const int textWidth = fm.size(Qt::TextShowMnemonic, opt.text).width(); + QSize csz; + + csz = QSize(textWidth + opt.iconSize.width() + hframe + widgetWidth + padding, height()); + + QSize retSize = style()->sizeFromContents(QStyle::CT_TabBarTab, &opt, csz, this); + return retSize; +} + /*** End of inlined file: SARibbonTabBar.cpp ***/ /*** Start of inlined file: SARibbonControlButton.cpp ***/ @@ -8480,12 +8515,11 @@ void SARibbonCategoryLayout::updateGeometryArr() // 如果total < categoryWidth,m_d->mXBase可以设置为0 // 判断是否超过总长度 #if SARibbonCategoryLayout_DEBUG_PRINT && SA_DEBUG_PRINT_SIZE_HINT - qDebug() << "SARibbonCategoryLayout::updateGeometryArr" - << "\n|-category name=" << category->categoryName() // - << "\n|-category height=" << height // - << "\n|-totalSizeHintWidth=" << total // - << "\n|-y=" << y // - << "\n|-expandWidth:" << expandWidth // + qDebug() << "SARibbonCategoryLayout::updateGeometryArr" << "\n|-category name=" << category->categoryName() // + << "\n|-category height=" << height // + << "\n|-totalSizeHintWidth=" << total // + << "\n|-y=" << y // + << "\n|-expandWidth:" << expandWidth // << "\n|-mag=" << mag; #endif if (total > categoryWidth) { @@ -10277,6 +10311,7 @@ class SARibbonBar::PrivateData mContextCategoryColorList = SARibbonBar::defaultContextCategoryColorList(); } void init(); + int systemTabBarHeight() const; // 计算tabbar高度 int calcTabBarHeight(); // 根据字体信息计算标题栏高度 @@ -10347,6 +10382,13 @@ void SARibbonBar::PrivateData::init() setNormalMode(); } +int SARibbonBar::PrivateData::systemTabBarHeight() const +{ + return q_ptr->style()->pixelMetric(QStyle::PM_TabBarBaseHeight) + + q_ptr->style()->pixelMetric(QStyle::PM_TabBarTabHSpace) + + q_ptr->style()->pixelMetric(QStyle::PM_TabBarTabOverlap); +} + /** * @brief 估算tabbar的高度 * @param fm @@ -10354,7 +10396,7 @@ void SARibbonBar::PrivateData::init() */ int SARibbonBar::PrivateData::calcTabBarHeight() { - int defaultHeight = q_ptr->style()->pixelMetric(QStyle::PM_TabBarBaseHeight); + int defaultHeight = systemTabBarHeight(); int fontHeight = q_ptr->fontMetrics().lineSpacing(); // 不要用height,像宋体这种字体,height=12,lineSpacing=14,有些就无法显示 int defaultHeight2 = fontHeight * 1.6; if (defaultHeight2 < fontHeight + 10) { @@ -10454,9 +10496,6 @@ void SARibbonBar::PrivateData::resetSize() updateHintSize(); const int th = tabBarHeigth(); int mainBarHeight = calcMainBarHeight(th, titleBarHeight(), categoryHeight(), mIsTabOnTitle, mCurrentRibbonMode); - if (mRibbonTabBar) { - mRibbonTabBar->setFixedHeight(th); - } // 处于最小模式下时,bar的高度为tabbar的bottom,这个调整必须在resize event之后 q_ptr->setFixedHeight(mainBarHeight); } @@ -10503,7 +10542,6 @@ int SARibbonBar::PrivateData::categoryHeight() const */ void SARibbonBar::PrivateData::updateHintSize() { - auto fm = q_ptr->fontMetrics(); mTitleBarHeight = calcTitleBarHeight(); // mTabBarHeight有大于0的值说明用户设置了,就使用用户设置的值 mTabBarHeight = calcTabBarHeight(); @@ -10540,20 +10578,20 @@ bool SARibbonBar::PrivateData::isContainContextCategoryInList(SARibbonContextCat void SARibbonBar::PrivateData::setMinimumMode() { mCurrentRibbonMode = SARibbonBar::MinimumRibbonMode; - this->mStackedContainerWidget->setPopupMode(); - this->mStackedContainerWidget->setFocusPolicy(Qt::NoFocus); - this->mStackedContainerWidget->clearFocus(); - this->mRibbonTabBar->setFocus(); - this->mStackedContainerWidget->hide(); + mStackedContainerWidget->setPopupMode(); + mStackedContainerWidget->setFocusPolicy(Qt::NoFocus); + mStackedContainerWidget->clearFocus(); + mRibbonTabBar->setFocus(); + mStackedContainerWidget->hide(); resetSize(); } void SARibbonBar::PrivateData::setNormalMode() { mCurrentRibbonMode = SARibbonBar::NormalRibbonMode; - this->mStackedContainerWidget->setNormalMode(); - this->mStackedContainerWidget->setFocus(); - this->mStackedContainerWidget->show(); + mStackedContainerWidget->setNormalMode(); + mStackedContainerWidget->setFocus(); + mStackedContainerWidget->show(); resetSize(); } @@ -10726,6 +10764,7 @@ void SARibbonBar::initHighDpi() QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); #endif #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + // 在有些时候,无法显示分割线,是由于PassThrough导致的 QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); #endif } @@ -11324,7 +11363,8 @@ SARibbonBar::RibbonMode SARibbonBar::currentRibbonState() const */ int SARibbonBar::tabBarHeight() const { - return d_ptr->mRibbonTabBar->height(); + return d_ptr->tabBarHeigth(); + // return d_ptr->mRibbonTabBar->height(); } /** @@ -11402,6 +11442,7 @@ void SARibbonBar::setCategoryHeight(int h, bool resizeByNow) } else { *(d_ptr->mUserDefCategoryHeight) = h; } + resizeStackedContainerWidget(); if (resizeByNow) { updateRibbonGeometry(); } @@ -12344,7 +12385,7 @@ void SARibbonBar::resizeStackedContainerWidget() int x = border.left(); int y = ribbonTabBarGeometry.bottom() + 1; int w = width() - border.left() - border.right(); - int h = d_ptr->mCategoryHeight; + int h = d_ptr->categoryHeight(); if (d_ptr->mStackedContainerWidget->isPopupMode()) { // 弹出模式时,位置为全局位置 QPoint absPosition = mapToGlobal(QPoint(x, y)); @@ -12493,7 +12534,7 @@ void SARibbonBar::resizeInLooseStyle() // cornerWidget - TopLeftCorner const int validTitleBarHeight = d_ptr->titleBarHeight(); const int tabH = d_ptr->tabBarHeigth(); - + // tabbar的标签不会因为tabbar的高度而铺满,tabbar的标签是固定高度的,tabbar拉高只会把底部露出来,因此,systab是理论合理的高度 // 布局corner widget x += d_ptr->mIconRightBorderPosition + 5; if (QWidget* connerL = cornerWidget(Qt::TopLeftCorner)) { @@ -12521,10 +12562,11 @@ void SARibbonBar::resizeInLooseStyle() } // 第二行,开始布局applicationButton,tabbar,tabBarRightSizeButtonGroupWidget,TopRightCorner x = border.left(); - y += validTitleBarHeight; + y += validTitleBarHeight; // 此时,y值在titlebar下面 // applicationButton 定位 if (d_ptr->mApplicationButton) { if (d_ptr->mApplicationButton->isVisibleTo(this)) { + // 保证 d_ptr->mApplicationButton->setGeometry(x, y, d_ptr->mApplicationButton->sizeHint().width(), tabH); x = d_ptr->mApplicationButton->geometry().right(); } @@ -12636,12 +12678,13 @@ void SARibbonBar::resizeInCompactStyle() } // tab 的y值需要重新计算 + // 紧凑模式下,tabbarHeight不生效 int tabH = tabBarHeight(); - if (tabH > validTitleBarHeight) { // 这种直接把tabH设置为validTitleBarHeight tabH = validTitleBarHeight; } + y = y + validTitleBarHeight - tabH; // 如果tabH较小,则下以,让tab底部和title的底部对齐 // applicationButton 定位,与TabBar同高 @@ -15383,6 +15426,7 @@ void SARibbonMainWindow::setRibbonBar(SARibbonBar* bar) helper->setHitTestVisible(bar->applicationButton()); // IMPORTANT! helper->setHitTestVisible(bar->quickAccessBar()); // IMPORTANT! helper->setHitTestVisible(bar->ribbonStackedWidget()); // IMPORTANT! +#if SARIBBON_ENABLE_SNAP_LAYOUT if (wg->closeButton()) { helper->setSystemButton(QWK::WindowAgentBase::Close, wg->closeButton()); } @@ -15392,6 +15436,7 @@ void SARibbonMainWindow::setRibbonBar(SARibbonBar* bar) if (wg->maximizeButton()) { helper->setSystemButton(QWK::WindowAgentBase::Maximize, wg->maximizeButton()); } +#endif #else bar->installEventFilter(this); // 设置窗体的标题栏高度 diff --git a/src/SARibbon.h b/src/SARibbon.h index 68f14ba..c97a243 100644 --- a/src/SARibbon.h +++ b/src/SARibbon.h @@ -1,4 +1,4 @@ -#ifndef SA_RIBBON_H +#ifndef SA_RIBBON_H #define SA_RIBBON_H // 定义此宏,将SA_RIBBON_EXPORT定义为空 #ifndef SA_RIBBON_BAR_NO_EXPORT @@ -95,7 +95,7 @@ class QWidget; * @def ribbon的数字版本 MAJ.{MIN}.PAT */ #ifndef SA_RIBBON_BAR_VERSION_MIN -#define SA_RIBBON_BAR_VERSION_MIN 1 +#define SA_RIBBON_BAR_VERSION_MIN 2 #endif /** * @def ribbon的数字版本 MAJ.MIN.{PAT} @@ -695,15 +695,15 @@ class SA_RIBBON_EXPORT SARibbonSystemButtonBar : public QFrame QSize iconSize() const; // 生成并添加一个action QAction* addAction(QAction* a, - Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, - QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); + Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, + QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); QAction* addAction(const QString& text, - const QIcon& icon, - Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, - QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); + const QIcon& icon, + Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, + QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); QAction* addMenu(QMenu* menu, - Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, - QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); + Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, + QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); QAction* addSeparator(); QAction* addWidget(QWidget* w); @@ -764,25 +764,25 @@ class SA_RIBBON_EXPORT SARibbonToolButton : public QToolButton SARibbonToolButton(QWidget* parent = Q_NULLPTR); SARibbonToolButton(QAction* defaultAction, QWidget* parent = Q_NULLPTR); ~SARibbonToolButton(); - // 标记按钮的样式,按钮的样式有不同的渲染方式 + // 标记按钮的样式,按钮的样式有不同的渲染方式 RibbonButtonType buttonType() const; void setButtonType(const RibbonButtonType& buttonType); - // 是否是小按钮 + // 是否是小按钮 bool isSmallRibbonButton() const; - // 是否是大按钮 + // 是否是大按钮 bool isLargeRibbonButton() const; - // 最小尺寸提示 + // 最小尺寸提示 virtual QSize minimumSizeHint() const Q_DECL_OVERRIDE; - // 获取间距 + // 获取间距 int spacing() const; - // 更新尺寸 + // 更新尺寸 void updateRect(); virtual QSize sizeHint() const Q_DECL_OVERRIDE; public: - // 在lite模式下是否允许文字换行 + // 在lite模式下是否允许文字换行 static void setEnableWordWrap(bool on); static bool isEnableWordWrap(); @@ -796,26 +796,26 @@ class SA_RIBBON_EXPORT SARibbonToolButton : public QToolButton virtual void leaveEvent(QEvent* e) Q_DECL_OVERRIDE; virtual bool hitButton(const QPoint& pos) const Q_DECL_OVERRIDE; virtual bool event(QEvent* e) Q_DECL_OVERRIDE; - // 事件改变 - 主要为了捕获字体的改变 + // 事件改变 - 主要为了捕获字体的改变 virtual void changeEvent(QEvent* e) Q_DECL_OVERRIDE; virtual void actionEvent(QActionEvent* e) Q_DECL_OVERRIDE; protected: - // 绘制按钮 + // 绘制按钮 virtual void paintButton(QPainter& p, const QStyleOptionToolButton& opt); - // 绘制图标 + // 绘制图标 virtual void paintIcon(QPainter& p, const QStyleOptionToolButton& opt, const QRect& iconDrawRect); - // 绘制文本 + // 绘制文本 virtual void paintText(QPainter& p, const QStyleOptionToolButton& opt, const QRect& textDrawRect); - // 绘制Indicator + // 绘制Indicator virtual void paintIndicator(QPainter& p, const QStyleOptionToolButton& opt, const QRect& indicatorDrawRect); private: static void drawArrow(const QStyle* style, - const QStyleOptionToolButton* toolbutton, - const QRect& rect, - QPainter* painter, - const QWidget* widget = 0); + const QStyleOptionToolButton* toolbutton, + const QRect& rect, + QPainter* painter, + const QWidget* widget = 0); protected: }; @@ -907,23 +907,23 @@ class SA_RIBBON_EXPORT SARibbonLineWidgetContainer : public QWidget public: SARibbonLineWidgetContainer(QWidget* par = nullptr); - // 设置widget,不允许设置一个nullptr + // 设置widget,不允许设置一个nullptr void setWidget(QWidget* innerWidget); - // 设置前缀 + // 设置前缀 void setPrefix(const QString& str); - // 设置后缀 + // 设置后缀 void setSuffix(const QString& str); - // 前缀文本框 + // 前缀文本框 QLabel* labelPrefix() const; - // 后缀文本框 + // 后缀文本框 QLabel* labelSuffix() const; private: - // 两个文本 + // 两个文本 QLabel* m_labelPrefix; QLabel* m_labelSuffix; QWidget* m_innerWidget; @@ -991,53 +991,53 @@ class SA_RIBBON_EXPORT SARibbonActionsManager : public QObject }; SARibbonActionsManager(SARibbonBar* bar); ~SARibbonActionsManager(); - // 设置tag对应的名字 + // 设置tag对应的名字 void setTagName(int tag, const QString& name); - // 获取tag对应的名字 + // 获取tag对应的名字 QString tagName(int tag) const; - // 移除tag,注意,这个函数非常耗时 + // 移除tag,注意,这个函数非常耗时 void removeTag(int tag); - // 注册action + // 注册action bool registeAction(QAction* act, int tag, const QString& key = QString(), bool enableEmit = true); - // 取消action的注册 + // 取消action的注册 void unregisteAction(QAction* act, bool enableEmit = true); - // 过滤得到actions对应的引用,实际是一个迭代器 + // 过滤得到actions对应的引用,实际是一个迭代器 QList< QAction* >& filter(int tag); - // 通过tag筛选出系列action + // 通过tag筛选出系列action QList< QAction* >& actions(int tag); const QList< QAction* > actions(int tag) const; - // 获取所有的标签 + // 获取所有的标签 QList< int > actionTags() const; - // 通过key获取action + // 通过key获取action QAction* action(const QString& key) const; - // 通过action找到key + // 通过action找到key QString key(QAction* act) const; - // 返回所有管理的action数 + // 返回所有管理的action数 int count() const; - // 返回所有管理的actions + // 返回所有管理的actions QList< QAction* > allActions() const; - // 自动加载action,返回tag对应的Category指针 + // 自动加载action,返回tag对应的Category指针 QMap< int, SARibbonCategory* > autoRegisteActions(SARibbonBar* bar); - // 自动加载widget下的actions函数返回的action,返回加载的数量,这些 + // 自动加载widget下的actions函数返回的action,返回加载的数量,这些 QSet< QAction* > autoRegisteWidgetActions(QWidget* w, int tag, bool enableEmit = false); - // 根据标题查找action + // 根据标题查找action QList< QAction* > search(const QString& text); - // 清除 + // 清除 void clear(); signals: @@ -1098,8 +1098,8 @@ class SA_RIBBON_EXPORT SARibbonLineEdit : public QLineEdit { Q_OBJECT public: - SARibbonLineEdit(QWidget* parent = Q_NULLPTR); - SARibbonLineEdit(const QString& text, QWidget* parent = Q_NULLPTR); + SARibbonLineEdit(QWidget* parent = Q_NULLPTR); + SARibbonLineEdit(const QString& text, QWidget* parent = Q_NULLPTR); }; #endif // SARIBBONLINEEDIT_H @@ -1119,8 +1119,8 @@ class SA_RIBBON_EXPORT SARibbonCheckBox : public QCheckBox { Q_OBJECT public: - SARibbonCheckBox(QWidget* parent = Q_NULLPTR); - SARibbonCheckBox(const QString& text, QWidget* parent = Q_NULLPTR); + SARibbonCheckBox(QWidget* parent = Q_NULLPTR); + SARibbonCheckBox(const QString& text, QWidget* parent = Q_NULLPTR); }; #endif // SARIBBONCHECKBOX_H @@ -1140,7 +1140,7 @@ class SA_RIBBON_EXPORT SARibbonComboBox : public QComboBox { Q_OBJECT public: - SARibbonComboBox(QWidget* parent = Q_NULLPTR); + SARibbonComboBox(QWidget* parent = Q_NULLPTR); }; #endif // SARIBBONCOMBOBOX_H @@ -1174,15 +1174,15 @@ class SA_RIBBON_EXPORT SARibbonButtonGroupWidget : public QFrame QSize iconSize() const; // 生成并添加一个action QAction* addAction(QAction* a, - Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, - QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); + Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, + QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); QAction* addAction(const QString& text, - const QIcon& icon, - Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, - QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); + const QIcon& icon, + Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, + QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); QAction* addMenu(QMenu* menu, - Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, - QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); + Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, + QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); QAction* addSeparator(); QAction* addWidget(QWidget* w); // 从ButtonGroupWidget中把action对应的button提取出来,如果action没有对应的button,就返回nullptr @@ -1270,7 +1270,6 @@ class SA_RIBBON_EXPORT SARibbonSeparatorWidget : public QFrame Q_OBJECT public: SARibbonSeparatorWidget(QWidget* parent = nullptr); - virtual QSize sizeHint() const override; }; #endif // SARIBBONSEPARATORWIDGET_H @@ -1343,12 +1342,12 @@ class SA_RIBBON_EXPORT SARibbonQuickAccessBar : public SARibbonCtrlContainer ~SARibbonQuickAccessBar(); void addSeparator(); void addAction(QAction* act, - Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, - QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); + Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, + QToolButton::ToolButtonPopupMode popMode = QToolButton::DelayedPopup); void addWidget(QWidget* w); void addMenu(QMenu* m, - Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, - QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); + Qt::ToolButtonStyle buttonStyle = Qt::ToolButtonIconOnly, + QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); // 获取内部管理的ButtonGroupWidget SARibbonButtonGroupWidget* buttonGroupWidget(); const SARibbonButtonGroupWidget* buttonGroupWidget() const; @@ -1379,6 +1378,9 @@ class SA_RIBBON_EXPORT SARibbonTabBar : public QTabBar const QMargins& tabMargin() const; void setTabMargin(const QMargins& tabMargin); +protected: + QSize tabSizeHint(int index) const; + private: QMargins m_tabMargin; }; @@ -1703,8 +1705,8 @@ class SA_RIBBON_EXPORT SARibbonPannel : public QFrame void addAction(QAction* action, SARibbonPannelItem::RowProportion rp); // 生成并添加一个action void addAction(QAction* act, - QToolButton::ToolButtonPopupMode popMode, - SARibbonPannelItem::RowProportion rp = SARibbonPannelItem::Large); + QToolButton::ToolButtonPopupMode popMode, + SARibbonPannelItem::RowProportion rp = SARibbonPannelItem::Large); // 把action加入到pannel,并以大图标显示 void addLargeAction(QAction* action); // 把action加入到pannel,在三行模式下会以中图标显示 @@ -1720,14 +1722,14 @@ class SA_RIBBON_EXPORT SARibbonPannel : public QFrame void addMediumAction(QAction* action, QToolButton::ToolButtonPopupMode popMode); QAction* addAction(const QString& text, - const QIcon& icon, - QToolButton::ToolButtonPopupMode popMode, - SARibbonPannelItem::RowProportion rp = SARibbonPannelItem::Large); + const QIcon& icon, + QToolButton::ToolButtonPopupMode popMode, + SARibbonPannelItem::RowProportion rp = SARibbonPannelItem::Large); // 添加menu void addMenu(QMenu* menu, - SARibbonPannelItem::RowProportion rp, - QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); + SARibbonPannelItem::RowProportion rp, + QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); // 添加普通大菜单 void addLargeMenu(QMenu* menu, QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup); @@ -2133,34 +2135,34 @@ class SA_RIBBON_EXPORT SARibbonContextCategory : public QObject public: SARibbonContextCategory(QWidget* parent = 0); ~SARibbonContextCategory(); - // 上下文目录添加下属目录 + // 上下文目录添加下属目录 SARibbonCategory* addCategoryPage(const QString& title); void addCategoryPage(SARibbonCategory* category); - // 获取上下文标签下管理的标签个数 + // 获取上下文标签下管理的标签个数 int categoryCount() const; - // 设置id + // 设置id void setId(const QVariant& id); QVariant id() const; - // 设置上下文颜色 + // 设置上下文颜色 void setContextColor(const QColor color); QColor contextColor() const; - // 上下文标签的内容 + // 上下文标签的内容 QString contextTitle() const; void setContextTitle(const QString& contextTitle); - // 获取对应的tab页 + // 获取对应的tab页 SARibbonCategory* categoryPage(int index); - // 获取所有的SARibbonCategory* + // 获取所有的SARibbonCategory* QList< SARibbonCategory* > categoryList() const; - // 移除category + // 移除category bool takeCategory(SARibbonCategory* category); - // 判断上下文是否维护了此SARibbonCategory + // 判断上下文是否维护了此SARibbonCategory bool isHaveCategory(SARibbonCategory* category) const; signals: /** @@ -2191,7 +2193,7 @@ private slots: void onCategoryTitleChanged(const QString& title); protected: - // 获取父级窗口 + // 获取父级窗口 QWidget* parentWidget() const; virtual bool eventFilter(QObject* watched, QEvent* e) override; }; @@ -2743,8 +2745,8 @@ class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar // 添加一个上下文标签 SARibbonContextCategory* addContextCategory(const QString& title, - const QColor& color = QColor(), - const QVariant& id = QVariant()); + const QColor& color = QColor(), + const QVariant& id = QVariant()); void addContextCategory(SARibbonContextCategory* context); // 显示一个上下文标签 @@ -3135,83 +3137,83 @@ class SA_RIBBON_EXPORT SARibbonCustomizeData }; SARibbonCustomizeData(); SARibbonCustomizeData(ActionType type, SARibbonActionsManager* mgr = nullptr); - // 获取CustomizeData的action type + // 获取CustomizeData的action type ActionType actionType() const; - // 设置CustomizeData的action type + // 设置CustomizeData的action type void setActionType(ActionType a); - // 判断是否是一个正常的CustomizeData + // 判断是否是一个正常的CustomizeData bool isValid() const; - // 应用SARibbonCustomizeData + // 应用SARibbonCustomizeData bool apply(SARibbonBar* bar) const; - // 获取actionmanager指针 + // 获取actionmanager指针 SARibbonActionsManager* actionManager(); - // 设置ActionsManager + // 设置ActionsManager void setActionsManager(SARibbonActionsManager* mgr); - // 对应AddCategoryActionType + // 对应AddCategoryActionType static SARibbonCustomizeData makeAddCategoryCustomizeData(const QString& title, int index, const QString& objName); - // 对应AddPannelActionType - static SARibbonCustomizeData makeAddPannelCustomizeData(const QString& title, - int index, - const QString& categoryobjName, - const QString& objName); + // 对应AddPannelActionType + static SARibbonCustomizeData makeAddPannelCustomizeData(const QString& title, + int index, + const QString& categoryobjName, + const QString& objName); - // 对应AddActionActionType + // 对应AddActionActionType static SARibbonCustomizeData makeAddActionCustomizeData(const QString& key, - SARibbonActionsManager* mgr, - SARibbonPannelItem::RowProportion rp, - const QString& categoryObjName, - const QString& pannelObjName); + SARibbonActionsManager* mgr, + SARibbonPannelItem::RowProportion rp, + const QString& categoryObjName, + const QString& pannelObjName); - // 对应RenameCategoryActionType + // 对应RenameCategoryActionType static SARibbonCustomizeData makeRenameCategoryCustomizeData(const QString& newname, const QString& categoryobjName); - // 对应RenamePannelActionType + // 对应RenamePannelActionType static SARibbonCustomizeData makeRenamePannelCustomizeData(const QString& newname, - const QString& categoryobjName, - const QString& pannelObjName); + const QString& categoryobjName, + const QString& pannelObjName); - // 对应RemoveCategoryActionType + // 对应RemoveCategoryActionType static SARibbonCustomizeData makeRemoveCategoryCustomizeData(const QString& categoryobjName); - // 对应ChangeCategoryOrderActionType + // 对应ChangeCategoryOrderActionType static SARibbonCustomizeData makeChangeCategoryOrderCustomizeData(const QString& categoryobjName, int moveindex); - // 对应ChangePannelOrderActionType + // 对应ChangePannelOrderActionType static SARibbonCustomizeData makeChangePannelOrderCustomizeData(const QString& categoryobjName, - const QString& pannelObjName, - int moveindex); + const QString& pannelObjName, + int moveindex); - // 对应ChangeActionOrderActionType + // 对应ChangeActionOrderActionType static SARibbonCustomizeData makeChangeActionOrderCustomizeData(const QString& categoryobjName, - const QString& pannelObjName, - const QString& key, - SARibbonActionsManager* mgr, - int moveindex); + const QString& pannelObjName, + const QString& key, + SARibbonActionsManager* mgr, + int moveindex); - // 对应RemovePannelActionType + // 对应RemovePannelActionType static SARibbonCustomizeData makeRemovePannelCustomizeData(const QString& categoryobjName, const QString& pannelObjName); - // 对应RemoveActionActionType + // 对应RemoveActionActionType static SARibbonCustomizeData makeRemoveActionCustomizeData(const QString& categoryobjName, - const QString& pannelObjName, - const QString& key, - SARibbonActionsManager* mgr); + const QString& pannelObjName, + const QString& key, + SARibbonActionsManager* mgr); - // 对应VisibleCategoryActionType + // 对应VisibleCategoryActionType static SARibbonCustomizeData makeVisibleCategoryCustomizeData(const QString& categoryobjName, bool isShow); - // 判断是否可以自定义,如果某个action不想被编辑,可以通过此函数设置 + // 判断是否可以自定义,如果某个action不想被编辑,可以通过此函数设置 static bool isCanCustomize(QObject* obj); static void setCanCustomize(QObject* obj, bool canbe = true); - // 对QList进行简化 + // 对QList进行简化 static QList< SARibbonCustomizeData > simplify(const QList< SARibbonCustomizeData >& csd); public: @@ -3285,11 +3287,11 @@ class SA_RIBBON_EXPORT SARibbonCustomizeWidget : public QWidget Q_OBJECT SA_RIBBON_DECLARE_PRIVATE(SARibbonCustomizeWidget) public: - // 保留接口 - SARibbonCustomizeWidget(SARibbonMainWindow* ribbonWindow, - QWidget* parent = nullptr, - Qt::WindowFlags f = Qt::WindowFlags()); - // 对于不使用SARibbonMainWindow的情况,使用此构造函数 + // 保留接口 + SARibbonCustomizeWidget(SARibbonMainWindow* ribbonWindow, + QWidget* parent = nullptr, + Qt::WindowFlags f = Qt::WindowFlags()); + // 对于不使用SARibbonMainWindow的情况,使用此构造函数 SARibbonCustomizeWidget(SARibbonBar* ribbonbar, QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); ~SARibbonCustomizeWidget(); @@ -3307,57 +3309,57 @@ class SA_RIBBON_EXPORT SARibbonCustomizeWidget : public QWidget */ enum ItemRole { - LevelRole = Qt::UserRole + 1, ///< 代表这是层级,有0:category 1:pannel 2:item - PointerRole = Qt::UserRole + 2, ///< 代表这是存放指针。根据LevelRole来进行转 - CanCustomizeRole = Qt::UserRole + 3, ///< 代表个item是可以自定义的.bool - CustomizeRole = Qt::UserRole + 4, ///< 代表这个是自定义的item,bool,主要用于那些自己添加的标签和pannel,有此角色必有CanCustomizeRole - CustomizeObjNameRole = Qt::UserRole + 5 ///< 记录了临时的自定义内容的obj名 QString + LevelRole = Qt::UserRole + 1, ///< 代表这是层级,有0:category 1:pannel 2:item + PointerRole = Qt::UserRole + 2, ///< 代表这是存放指针。根据LevelRole来进行转 + CanCustomizeRole = Qt::UserRole + 3, ///< 代表个item是可以自定义的.bool + CustomizeRole = Qt::UserRole + 4, ///< 代表这个是自定义的item,bool,主要用于那些自己添加的标签和pannel,有此角色必有CanCustomizeRole + CustomizeObjNameRole = Qt::UserRole + 5 ///< 记录了临时的自定义内容的obj名 QString }; - // 设置action管理器 + // 设置action管理器 void setupActionsManager(SARibbonActionsManager* mgr); - // 判断用户是否有要存储的内容,对应save动作 + // 判断用户是否有要存储的内容,对应save动作 bool isApplied() const; - // 判断用户是否有改动内容,对应apply动作 + // 判断用户是否有改动内容,对应apply动作 bool isCached() const; - // 获取model + // 获取model const QStandardItemModel* model() const; - // 根据当前的radiobutton选项来更新model + // 根据当前的radiobutton选项来更新model void updateModel(); - // 更新model + // 更新model void updateModel(RibbonTreeShowType type); - // 应用所有的设定 + // 应用所有的设定 bool applys(); - // 转换为xml + // 转换为xml bool toXml(QXmlStreamWriter* xml) const; bool toXml(const QString& xmlpath) const; - // 从xml中加载QList,对于基于配置文件的设置,对话框显示前建议调用此函数,保证叠加设置的正确记录 + // 从xml中加载QList,对于基于配置文件的设置,对话框显示前建议调用此函数,保证叠加设置的正确记录 void fromXml(QXmlStreamReader* xml); void fromXml(const QString& xmlpath); - // 应用xml配置,可以结合customize_datas_from_xml和customize_datas_apply函数 + // 应用xml配置,可以结合customize_datas_from_xml和customize_datas_apply函数 static bool fromXml(QXmlStreamReader* xml, SARibbonBar* bar, SARibbonActionsManager* mgr); - // 缓存应用的动作,这些动作不会被clear清除,用于本地存储 + // 缓存应用的动作,这些动作不会被clear清除,用于本地存储 void makeActionsApplied(); - // 清除applied的动作,cancel操作后需要清空已应用的动作 + // 清除applied的动作,cancel操作后需要清空已应用的动作 void clearApplied(); - // 清除缓存动作,在执行applys函数后,如果要继续调用,应该clear,否则会导致异常 + // 清除缓存动作,在执行applys函数后,如果要继续调用,应该clear,否则会导致异常 void clearCache(); - // 清除所有动作,不包含本地读取的数据 + // 清除所有动作,不包含本地读取的数据 void clear(); protected: - // 把QList进行裁剪,把一些动作合并 + // 把QList进行裁剪,把一些动作合并 void simplify(); SARibbonPannelItem::RowProportion selectedRowProportion() const; @@ -3367,24 +3369,24 @@ class SA_RIBBON_EXPORT SARibbonCustomizeWidget : public QWidget QStandardItem* selectedItem() const; - // 获取选中的ribbon tree 的level + // 获取选中的ribbon tree 的level int selectedRibbonLevel() const; - // 根据选中的item判断 + // 根据选中的item判断 int itemLevel(QStandardItem* item) const; - // 设置某个item被选中 + // 设置某个item被选中 void setSelectItem(QStandardItem* item, bool ensureVisible = true); - // 判断itemn能否改动,可以改动返回true + // 判断itemn能否改动,可以改动返回true bool isItemCanCustomize(QStandardItem* item) const; bool isSelectedItemCanCustomize() const; - // 判断item是否是自定义的item + // 判断item是否是自定义的item bool isCustomizeItem(QStandardItem* item) const; bool isSelectedItemIsCustomize() const; - // 删除一个item + // 删除一个item void removeItem(QStandardItem* item); private slots: @@ -3492,37 +3494,37 @@ class SA_RIBBON_EXPORT SARibbonCustomizeDialog : public QDialog { Q_OBJECT public: - SARibbonCustomizeDialog(SARibbonMainWindow* ribbonWindow, QWidget* p = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); - // 设置action管理器 - void setupActionsManager(SARibbonActionsManager* mgr); + SARibbonCustomizeDialog(SARibbonMainWindow* ribbonWindow, QWidget* p = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); + // 设置action管理器 + void setupActionsManager(SARibbonActionsManager* mgr); - // 判断用户是否有要存储的内容,对应save动作 + // 判断用户是否有要存储的内容,对应save动作 bool isApplied() const; - // 判断用户是否有改动内容,对应apply动作 + // 判断用户是否有改动内容,对应apply动作 bool isCached() const; - // 应用所有的设定 + // 应用所有的设定 bool applys(); - // 清除所有动作 + // 清除所有动作 void clear(); - // 转换为xml - bool toXml(QXmlStreamWriter* xml) const; + // 转换为xml + bool toXml(QXmlStreamWriter* xml) const; bool toXml(const QString& xmlpath) const; - // 从xml中加载QList,对于基于配置文件的设置,对话框显示前建议调用此函数,保证叠加设置的正确记录 - void fromXml(QXmlStreamReader* xml); + // 从xml中加载QList,对于基于配置文件的设置,对话框显示前建议调用此函数,保证叠加设置的正确记录 + void fromXml(QXmlStreamReader* xml); void fromXml(const QString& xmlpath); - // 返回SARibbonCustomizeWidget窗口指针 - SARibbonCustomizeWidget* customizeWidget() const; + // 返回SARibbonCustomizeWidget窗口指针 + SARibbonCustomizeWidget* customizeWidget() const; private: void initConnection(); - SARibbonCustomizeDialogUi* ui; + SARibbonCustomizeDialogUi* ui; }; #endif // SARIBBONCUSTOMIZEDIALOG_H diff --git a/src/SARibbonBar/SARibbonGlobal.h b/src/SARibbonBar/SARibbonGlobal.h index c774faa..de00ca9 100644 --- a/src/SARibbonBar/SARibbonGlobal.h +++ b/src/SARibbonBar/SARibbonGlobal.h @@ -18,7 +18,7 @@ class QWidget; * @def ribbon的数字版本 MAJ.{MIN}.PAT */ #ifndef SA_RIBBON_BAR_VERSION_MIN -#define SA_RIBBON_BAR_VERSION_MIN 1 +#define SA_RIBBON_BAR_VERSION_MIN 2 #endif /** * @def ribbon的数字版本 MAJ.MIN.{PAT}