diff --git a/src/SARibbonBar/SARibbonBar.cpp b/src/SARibbonBar/SARibbonBar.cpp index e41fec7..f4714f0 100644 --- a/src/SARibbonBar/SARibbonBar.cpp +++ b/src/SARibbonBar/SARibbonBar.cpp @@ -151,10 +151,7 @@ void SARibbonBar::PrivateData::init() // mStackedContainerWidget = RibbonSubElementFactory->createRibbonStackedWidget(q_ptr); mStackedContainerWidget->setObjectName(QStringLiteral("objSARibbonStackedContainerWidget")); - mStackedContainerWidget->connect(mStackedContainerWidget, - &SARibbonStackedWidget::hidWindow, - q_ptr, - &SARibbonBar::onStackWidgetHided); + mStackedContainerWidget->connect(mStackedContainerWidget, &SARibbonStackedWidget::hidWindow, q_ptr, &SARibbonBar::onStackWidgetHided); // 捕获事件,在popmode时必须用到 mStackedContainerWidget->installEventFilter(q_ptr); // @@ -229,11 +226,7 @@ int SARibbonBar::PrivateData::calcCategoryHeight() * @param categoryHeight * @return */ -int SARibbonBar::PrivateData::calcMainBarHeight(int tabHegith, - int titleHeight, - int categoryHeight, - bool tabOnTitle, - SARibbonBar::RibbonMode rMode) +int SARibbonBar::PrivateData::calcMainBarHeight(int tabHegith, int titleHeight, int categoryHeight, bool tabOnTitle, SARibbonBar::RibbonMode rMode) { if (rMode == MinimumRibbonMode) { // 最小模式,没有categoryHeight @@ -509,7 +502,7 @@ QList< QColor > SARibbonBar::defaultContextCategoryColorList() << QColor(14, 81, 167) // 蓝 << QColor(228, 0, 69) // 红 << QColor(67, 148, 0) // 绿 - ; + ; return res; } @@ -1051,13 +1044,11 @@ void SARibbonBar::showMinimumModeButton(bool isShow) d_ptr->mMinimumCategoryButtonAction = new QAction(this); d_ptr->mMinimumCategoryButtonAction->setIcon( - style()->standardIcon(isMinimumMode() ? QStyle::SP_TitleBarUnshadeButton : QStyle::SP_TitleBarShadeButton, - nullptr)); + style()->standardIcon(isMinimumMode() ? QStyle::SP_TitleBarUnshadeButton : QStyle::SP_TitleBarShadeButton, nullptr)); connect(d_ptr->mMinimumCategoryButtonAction, &QAction::triggered, this, [ this ]() { this->setMinimumMode(!isMinimumMode()); this->d_ptr->mMinimumCategoryButtonAction->setIcon( - style()->standardIcon(isMinimumMode() ? QStyle::SP_TitleBarUnshadeButton : QStyle::SP_TitleBarShadeButton, - nullptr)); + style()->standardIcon(isMinimumMode() ? QStyle::SP_TitleBarUnshadeButton : QStyle::SP_TitleBarShadeButton, nullptr)); }); d_ptr->mRightButtonGroup->addAction(d_ptr->mMinimumCategoryButtonAction); @@ -1447,7 +1438,7 @@ void SARibbonBar::setRibbonStyle(SARibbonBar::RibbonStyles v) << "\n isTwoRowStyle=" << isTwoRowStyle() // << "\n isLooseStyle=" << isLooseStyle() // << "\n isCompactStyle=" << isCompactStyle() // - ; + ; #endif // 执行判断 setEnableWordWrap(isThreeRowStyle(v)); @@ -1930,6 +1921,7 @@ void SARibbonBar::showWindowButtonGroup(bool on) d_ptr->mWindowButtonGroup->raise(); d_ptr->mWindowButtonGroup->show(); } + resizeAll(); } /** @@ -2117,11 +2109,10 @@ void SARibbonBar::paintInLooseStyle() titleRegion.setRect(d_ptr->mQuickAccessBar->geometry().right() + 1, border.top(), width() - d_ptr->mIconRightBorderPosition - border.right() - - d_ptr->mWindowButtonSize.width() - d_ptr->mQuickAccessBar->geometry().right() - 1, + - d_ptr->mWindowButtonSize.width() - d_ptr->mQuickAccessBar->geometry().right() - 1, titleBarHeight()); } else { - int leftwidth = contextCategoryRegion.x() - d_ptr->mQuickAccessBar->geometry().right() - - d_ptr->mIconRightBorderPosition; + int leftwidth = contextCategoryRegion.x() - d_ptr->mQuickAccessBar->geometry().right() - d_ptr->mIconRightBorderPosition; int rightwidth = width() - contextCategoryRegion.y() - d_ptr->mWindowButtonSize.width(); // if (width() - contextCategoryRegion.y() > contextCategoryRegion.x()-x) { if (rightwidth > leftwidth) { @@ -2597,7 +2588,7 @@ QDebug operator<<(QDebug debug, const SARibbonBar& ribbon) << "\n -mEnableShowPannelTitle=" << ribbon.d_ptr->mEnableShowPannelTitle // << "\n -mWindowButtonSize=" << ribbon.d_ptr->mWindowButtonSize // << "\n -mIconRightBorderPosition=" << ribbon.d_ptr->mIconRightBorderPosition // - ; + ; return debug; } diff --git a/src/SARibbonBar/SAWindowButtonGroup.cpp b/src/SARibbonBar/SAWindowButtonGroup.cpp index 6408aa8..85b66b2 100644 --- a/src/SARibbonBar/SAWindowButtonGroup.cpp +++ b/src/SARibbonBar/SAWindowButtonGroup.cpp @@ -22,7 +22,7 @@ class SAWindowButtonGroup::PrivateData int mCloseStretch { 4 }; int mMaxStretch { 3 }; int mMinStretch { 3 }; - qreal mIconscale { 0.5 }; + int mTitleBarHeight { 28 }; Qt::WindowFlags mFlags; PrivateData(SAWindowButtonGroup* p) : q_ptr(p), mFlags(Qt::WindowFlags()) { @@ -155,17 +155,17 @@ class SAWindowButtonGroup::PrivateData QSize sizeHint() const { - int width = 0; - int height = 30; - + int height = mTitleBarHeight; + int btnWidth = mTitleBarHeight * 1.5; + int width(0); if (buttonClose) { - width += 40; + width += btnWidth; } if (buttonMaximize) { - width += 30; + width += btnWidth; } if (buttonMinimize) { - width += 30; + width += btnWidth; } return (QSize(width, height)); } @@ -185,9 +185,6 @@ SAWindowButtonGroup::SAWindowButtonGroup(QWidget* parent) : QWidget(parent), d_ptr(new SAWindowButtonGroup::PrivateData(this)) { updateWindowFlag(); - if (parent) { - parent->installEventFilter(this); - } } /** @@ -200,9 +197,6 @@ SAWindowButtonGroup::SAWindowButtonGroup(QWidget* parent, Qt::WindowFlags flags) { d_ptr->mFlags = flags; updateWindowFlag(); - if (parent) { - parent->installEventFilter(this); - } } SAWindowButtonGroup::~SAWindowButtonGroup() @@ -226,15 +220,13 @@ void SAWindowButtonGroup::setupCloseButton(bool on) void SAWindowButtonGroup::updateWindowFlag() { - Qt::WindowFlags flags = parentWidget()->windowFlags(); - - d_ptr->mFlags = flags; - - setupMinimizeButton(flags & Qt::WindowMinimizeButtonHint); - - setupMaximizeButton(flags & Qt::WindowMaximizeButtonHint); - - setupCloseButton(flags & Qt::WindowCloseButtonHint); + QWidget* topedWidget = this; + // 找到最顶层窗口 + while (topedWidget->parentWidget()) { + topedWidget = topedWidget->parentWidget(); + } + Qt::WindowFlags flags = topedWidget->windowFlags(); + updateWindowFlag(flags); } /** @@ -243,27 +235,9 @@ void SAWindowButtonGroup::updateWindowFlag() */ void SAWindowButtonGroup::updateWindowFlag(Qt::WindowFlags flags) { - if (flags & Qt::WindowCloseButtonHint) { - d_ptr->mFlags |= Qt::WindowCloseButtonHint; - } else { - d_ptr->mFlags &= (~Qt::WindowCloseButtonHint); - } - - if (flags & Qt::WindowMaximizeButtonHint) { - d_ptr->mFlags |= Qt::WindowMaximizeButtonHint; - } else { - d_ptr->mFlags &= (~Qt::WindowMaximizeButtonHint); - } - - if (flags & Qt::WindowMinimizeButtonHint) { - d_ptr->mFlags |= Qt::WindowMinimizeButtonHint; - } else { - d_ptr->mFlags &= (~Qt::WindowMinimizeButtonHint); - } + d_ptr->mFlags = flags; setupMinimizeButton(flags & Qt::WindowMinimizeButtonHint); - setupMaximizeButton(flags & Qt::WindowMaximizeButtonHint); - setupCloseButton(flags & Qt::WindowCloseButtonHint); } @@ -281,12 +255,23 @@ void SAWindowButtonGroup::setButtonWidthStretch(int close, int max, int min) } /** - * @brief 设置按钮的缩放比例 - * @param iconscale 数值越小按钮越小 + * @brief 标题栏高度 + * + * 标题栏高度会影响sizeHint + * @param h */ -void SAWindowButtonGroup::setIconScale(qreal iconscale) +void SAWindowButtonGroup::setTitleBarHeight(int h) { - d_ptr->mIconscale = iconscale; + d_ptr->mTitleBarHeight = h; +} + +/** + * @brief 标题栏高度 + * @return + */ +int SAWindowButtonGroup::titleBarHeight() const +{ + return d_ptr->mTitleBarHeight; } /** @@ -329,40 +314,6 @@ QSize SAWindowButtonGroup::sizeHint() const return (d_ptr->sizeHint()); } -bool SAWindowButtonGroup::eventFilter(QObject* watched, QEvent* e) -{ - // 用于监听父窗口改变尺寸 - if (watched == parentWidget()) { - switch (e->type()) { - case QEvent::Resize: - parentResize(); - break; - - default: - break; - } - } - return (false); // 不截断任何事件 -} - -void SAWindowButtonGroup::parentResize() -{ - QWidget* par = parentWidget(); - if (SARibbonMainWindow* rb = qobject_cast< SARibbonMainWindow* >(par)) { - if (SARibbonBar* bar = rb->ribbonBar()) { - // 先看看titlebar多高 - if (height() != bar->titleBarHeight()) { - setFixedHeight(bar->titleBarHeight()); - } - d_ptr->resize(QSize(width(), height())); - } - } - if (par) { - QSize parSize = par->size(); - move(parSize.width() - width() - 1, 0); - } -} - void SAWindowButtonGroup::resizeEvent(QResizeEvent* e) { d_ptr->resize(e->size()); diff --git a/src/SARibbonBar/SAWindowButtonGroup.h b/src/SARibbonBar/SAWindowButtonGroup.h index 9e77730..cd55fc7 100644 --- a/src/SARibbonBar/SAWindowButtonGroup.h +++ b/src/SARibbonBar/SAWindowButtonGroup.h @@ -18,26 +18,22 @@ class SA_RIBBON_EXPORT SAWindowButtonGroup : public QWidget void setupMinimizeButton(bool on); void setupMaximizeButton(bool on); void setupCloseButton(bool on); + // 以最顶层的widget的WindowFlag作为WindowFlag void updateWindowFlag(); void updateWindowFlag(Qt::WindowFlags flags); - // 设置按钮的宽度比例,最终按钮宽度将按照此比例进行设置 void setButtonWidthStretch(int close = 4, int max = 3, int min = 3); - - // 设置按钮的缩放比例 - void setIconScale(qreal iconscale = 0.5); - + // 标题栏高度 + void setTitleBarHeight(int h); + int titleBarHeight() const; // 设置Qt::WindowStates void setWindowStates(Qt::WindowStates s); - // 仅获取按钮的状态 Qt::WindowFlags windowButtonFlags() const; virtual QSize sizeHint() const Q_DECL_OVERRIDE; protected: - virtual bool eventFilter(QObject* watched, QEvent* e) Q_DECL_OVERRIDE; - virtual void parentResize(); virtual void resizeEvent(QResizeEvent* e) Q_DECL_OVERRIDE; protected slots: