Skip to content

Commit

Permalink
把SARibbonMainWindow的事件处理通过eventfilter实现,避免用户在重写事件时误操作
Browse files Browse the repository at this point in the history
  • Loading branch information
czyt1988 committed Jul 16, 2024
1 parent 509b595 commit a8db70a
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 55 deletions.
1 change: 1 addition & 0 deletions src/SARibbonBar/SARibbonBar.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
89 changes: 38 additions & 51 deletions src/SARibbonBar/SARibbonMainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class SARibbonMainWindow::PrivateData
#else
SAFramelessHelper* mFramelessHelper { nullptr };
#endif
SARibbonMainWindowEventFilter* mEventFilter { nullptr };
};

SARibbonMainWindow::PrivateData::PrivateData(SARibbonMainWindow* p) : q_ptr(p)
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
12 changes: 8 additions & 4 deletions src/SARibbonBar/SARibbonMainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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
37 changes: 37 additions & 0 deletions src/SARibbonBar/SARibbonSystemButtonBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <QStyle>
#include <QDebug>
#include <QScopedPointer>
#include <QWindowStateChangeEvent>
#include "SARibbonMainWindow.h"
#include "SARibbonBar.h"
#include "SARibbonElementManager.h"
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/SARibbonBar/SARibbonSystemButtonBar.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit a8db70a

Please sign in to comment.