diff --git a/src/SARibbonBar/SARibbonBar.h b/src/SARibbonBar/SARibbonBar.h index 1ab1209..3e56ad6 100644 --- a/src/SARibbonBar/SARibbonBar.h +++ b/src/SARibbonBar/SARibbonBar.h @@ -94,6 +94,7 @@ class SA_RIBBON_EXPORT SARibbonBar : public QMenuBar Q_OBJECT SA_RIBBON_DECLARE_PRIVATE(SARibbonBar) friend class SARibbonMainWindow; + friend class SARibbonSystemButtonBar; Q_PROPERTY(RibbonStyles ribbonStyle READ currentRibbonStyle WRITE setRibbonStyle) Q_PROPERTY(bool minimumMode READ isMinimumMode WRITE setMinimumMode) Q_PROPERTY(bool minimumModeButton READ haveShowMinimumModeButton WRITE showMinimumModeButton) diff --git a/src/SARibbonBar/SARibbonMainWindow.cpp b/src/SARibbonBar/SARibbonMainWindow.cpp index 2a8945e..95823ff 100644 --- a/src/SARibbonBar/SARibbonMainWindow.cpp +++ b/src/SARibbonBar/SARibbonMainWindow.cpp @@ -37,6 +37,7 @@ class SARibbonMainWindow::PrivateData #else SAFramelessHelper* mFramelessHelper { nullptr }; #endif + SARibbonMainWindowEventFilter* mEventFilter { nullptr }; }; SARibbonMainWindow::PrivateData::PrivateData(SARibbonMainWindow* p) : q_ptr(p) @@ -84,23 +85,23 @@ SARibbonBar* SARibbonMainWindow::ribbonBar() const * @brief 设置ribbonbar * @param bar */ -void SARibbonMainWindow::setRibbonBar(SARibbonBar* bar) +void SARibbonMainWindow::setRibbonBar(SARibbonBar* ribbon) { QWidget* old = QMainWindow::menuWidget(); if (old) { // 如果之前已经设置了menubar,要把之前的删除 old->deleteLater(); } - QMainWindow::setMenuWidget(bar); - const int th = bar->titleBarHeight(); + QMainWindow::setMenuWidget(ribbon); + const int th = ribbon->titleBarHeight(); // 设置window按钮 if (nullptr == d_ptr->mWindowButtonGroup) { d_ptr->mWindowButtonGroup = RibbonSubElementFactory->createWindowButtonGroup(this); } - SARibbonSystemButtonBar* wg = d_ptr->mWindowButtonGroup; - wg->setWindowStates(windowState()); - wg->setWindowTitleHeight(th); - wg->show(); + SARibbonSystemButtonBar* sysBar = d_ptr->mWindowButtonGroup; + sysBar->setWindowStates(windowState()); + sysBar->setWindowTitleHeight(th); + sysBar->show(); #if SARIBBON_USE_3RDPARTY_FRAMELESSHELPER auto helper = d_ptr->mFramelessHelper; helper->setTitleBar(bar); @@ -123,11 +124,19 @@ void SARibbonMainWindow::setRibbonBar(SARibbonBar* bar) } #endif #else - bar->installEventFilter(this); + // 捕获ribbonbar的事件 + ribbon->installEventFilter(this); + // SARibbonSystemButtonBar的eventfilter捕获mainwindow的事件 + // 通过eventerfilter来处理mainwindow的事件,避免用户错误的继承resizeEvent导致systembar的位置异常 + installEventFilter(sysBar); // 设置窗体的标题栏高度 d_ptr->mFramelessHelper->setTitleHeight(th); d_ptr->mFramelessHelper->setRubberBandOnResize(false); #endif + if (!d_ptr->mEventFilter) { + d_ptr->mEventFilter = new SARibbonMainWindowEventFilter(this); + installEventFilter(d_ptr->mEventFilter); + } } #if SARIBBON_USE_3RDPARTY_FRAMELESSHELPER @@ -292,49 +301,6 @@ SARibbonBar* SARibbonMainWindow::createRibbonBar() return bar; } -void SARibbonMainWindow::resizeEvent(QResizeEvent* e) -{ - QMainWindow::resizeEvent(e); - SARibbonBar* bar = ribbonBar(); - SARibbonSystemButtonBar* wg = d_ptr->mWindowButtonGroup; - - if (wg) { - if (bar) { - const int th = bar->titleBarHeight(); - if (th != wg->height()) { - wg->setWindowTitleHeight(th); - } - } - QSize wgSizeHint = wg->sizeHint(); - wg->setGeometry(frameGeometry().width() - wgSizeHint.width(), 0, wgSizeHint.width(), wgSizeHint.height()); - } - if (bar) { - if (wg) { - bar->setWindowButtonGroupSize(wg->size()); - } - if (bar->size().width() != (this->size().width())) { - bar->setFixedWidth(this->size().width()); - } - } -} - -void SARibbonMainWindow::changeEvent(QEvent* e) -{ - if (e) { - switch (e->type()) { - case QEvent::WindowStateChange: { - if (SARibbonSystemButtonBar* wg = d_ptr->mWindowButtonGroup) { - wg->setWindowStates(windowState()); - } - } break; - - default: - break; - } - } - QMainWindow::changeEvent(e); -} - /** * @brief 主屏幕切换触发的信号 * @param screen @@ -382,3 +348,24 @@ void sa_set_ribbon_theme(QWidget* w, SARibbonTheme theme) QString qss = QString::fromUtf8(file.readAll()); w->setStyleSheet(qss); } + +//---------------------------------------------------- +// SARibbonMainWindowEventFilter +//---------------------------------------------------- +SARibbonMainWindowEventFilter::SARibbonMainWindowEventFilter(QObject* par) : QObject(par) +{ +} + +bool SARibbonMainWindowEventFilter::eventFilter(QObject* obj, QEvent* e) +{ + if (e) { + if (e->type() == QEvent::Resize) { + if (SARibbonMainWindow* m = qobject_cast< SARibbonMainWindow* >(obj)) { + if (SARibbonBar* ribbon = m->ribbonBar()) { + ribbon->setFixedWidth(m->size().width()); + } + } + } + } + return QObject::eventFilter(obj, e); +} diff --git a/src/SARibbonBar/SARibbonMainWindow.h b/src/SARibbonBar/SARibbonMainWindow.h index d1355f3..6098fe6 100644 --- a/src/SARibbonBar/SARibbonMainWindow.h +++ b/src/SARibbonBar/SARibbonMainWindow.h @@ -46,7 +46,7 @@ class SA_RIBBON_EXPORT SARibbonMainWindow : public QMainWindow // 返回SARibbonBar SARibbonBar* ribbonBar() const; // 设置ribbonbar - void setRibbonBar(SARibbonBar* bar); + void setRibbonBar(SARibbonBar* ribbon); #if !SARIBBON_USE_3RDPARTY_FRAMELESSHELPER // 返回SAFramelessHelper SAFramelessHelper* framelessHelper(); @@ -71,12 +71,16 @@ class SA_RIBBON_EXPORT SARibbonMainWindow : public QMainWindow protected: // 创建ribbonbar的工厂函数 SARibbonBar* createRibbonBar(); - virtual void resizeEvent(QResizeEvent* e) Q_DECL_OVERRIDE; - virtual void changeEvent(QEvent* e) Q_DECL_OVERRIDE; private slots: void onPrimaryScreenChanged(QScreen* screen); }; - +class SARibbonMainWindowEventFilter : public QObject +{ + Q_OBJECT +public: + SARibbonMainWindowEventFilter(QObject* par); + virtual bool eventFilter(QObject* obj, QEvent* e) Q_DECL_OVERRIDE; +}; #endif // SARIBBONMAINWINDOW_H diff --git a/src/SARibbonBar/SARibbonSystemButtonBar.cpp b/src/SARibbonBar/SARibbonSystemButtonBar.cpp index f45f716..47715bb 100644 --- a/src/SARibbonBar/SARibbonSystemButtonBar.cpp +++ b/src/SARibbonBar/SARibbonSystemButtonBar.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "SARibbonMainWindow.h" #include "SARibbonBar.h" #include "SARibbonElementManager.h" @@ -343,6 +344,42 @@ QSize SARibbonSystemButtonBar::sizeHint() const return (d_ptr->sizeHint()); } +bool SARibbonSystemButtonBar::eventFilter(QObject* obj, QEvent* event) +{ + if (obj == parent()) { + // SARibbonMainWindow的事件 + if (event->type() == QEvent::Resize) { + SARibbonMainWindow* mainWindow = qobject_cast< SARibbonMainWindow* >(obj); + if (!mainWindow) { + // 所有事件都不消费 + return QFrame::eventFilter(obj, event); + } + SARibbonBar* ribbonBar = mainWindow->ribbonBar(); + if (!ribbonBar) { + // 所有事件都不消费 + return QFrame::eventFilter(obj, event); + } + const int th = ribbonBar->titleBarHeight(); + if (th != height()) { + setWindowTitleHeight(th); + } + QRect fr = mainWindow->frameGeometry(); + QSize wgSizeHint = sizeHint(); + setGeometry(fr.width() - wgSizeHint.width(), 0, wgSizeHint.width(), wgSizeHint.height()); + // 把设置好的尺寸给ribbonbar + ribbonBar->setWindowButtonGroupSize(size()); + } else if (event->type() == QEvent::WindowStateChange) { + SARibbonMainWindow* mainWindow = qobject_cast< SARibbonMainWindow* >(obj); + if (!mainWindow) { + // 所有事件都不消费 + return QFrame::eventFilter(obj, event); + } + setWindowStates(mainWindow->windowState()); + } + } + return QFrame::eventFilter(obj, event); +} + QAbstractButton* SARibbonSystemButtonBar::minimizeButton() const { return d_ptr->buttonMinimize; diff --git a/src/SARibbonBar/SARibbonSystemButtonBar.h b/src/SARibbonBar/SARibbonSystemButtonBar.h index cc790ae..dc1a5e6 100644 --- a/src/SARibbonBar/SARibbonSystemButtonBar.h +++ b/src/SARibbonBar/SARibbonSystemButtonBar.h @@ -63,6 +63,8 @@ class SA_RIBBON_EXPORT SARibbonSystemButtonBar : public QFrame QAction* addWidget(QWidget* w); virtual QSize sizeHint() const Q_DECL_OVERRIDE; + // 捕获mainwindow的事件 + bool eventFilter(QObject* obj, QEvent* event) override; protected: virtual void resizeEvent(QResizeEvent* e) Q_DECL_OVERRIDE;