instAdmin/Cpp/GisDes/SaRibbon/SARibbonBar/SARibbonMainWindow.h

110 lines
4.1 KiB
C
Raw Normal View History

2024-10-29 22:24:50 +08:00
#ifndef SARIBBONMAINWINDOW_H
#define SARIBBONMAINWINDOW_H
#include "SARibbonGlobal.h"
#include <QMainWindow>
#if !SARIBBON_USE_3RDPARTY_FRAMELESSHELPER
class SAFramelessHelper;
#endif
class QAction;
class SARibbonBar;
class SARibbonSystemButtonBar;
class QScreen;
/**
* @brief 使SARibbonBar使QMainWindow
*
* ribbon的风格和传统的Toolbar风格差异较大
* SARibbonBar使用需要把原有的QMainWindow替换为SARibbonMainWindow,
* SARibbonMainWindow是个无边框窗体QMainWindow使https://github.com/wangwenx190/framelesshelper
* useRibbon用于指定是否使用ribbon风格true
*
* @code
* SARibbonMainWindow(QWidget* parent = nullptr,bool useRibbon = true);
* @endcode
*
* ribbon风格useRibbon设置为false即可,
* isUseRibbon用于判断当前是否为ribbon模式Toolbar风格和ribbon风格时非常有用
*
*
* Ribbon模式下Ribbon相关的接口都会返回空指针
*
* @code
* bool isUseRibbon() const;
* @endcode
*
* @ref SARibbonMainWindow ribbon样式
* @ref setRibbonTheme ribbon的样式qss自己定义自己的样式
*
* SARibbonBar@ref setRibbonBar ribbonbar进去
*
* Ribbon@ref SARibbonElementFactory
*
* @code
* class MyRibbonFactory:public SARibbonElementFactory{
* ...
* virtual SARibbonBar* createRibbonBar(QWidget* parent){
* return new MyRibbonBar(parent);
* }
* };
* @endcode
*
* SARibbonMainWindow生成之前(main函数
*
* @code
* SARibbonElementManager::instance()->setupFactory(new MyRibbonFactory());
* @endcode
*
* Ribbon的元素会通过MyRibbonFactory的接口来生成
*/
class SA_RIBBON_EXPORT SARibbonMainWindow : public QMainWindow
{
Q_OBJECT
SA_RIBBON_DECLARE_PRIVATE(SARibbonMainWindow)
friend class SARibbonBar;
Q_PROPERTY(SARibbonTheme ribbonTheme READ ribbonTheme WRITE setRibbonTheme)
public:
SARibbonMainWindow(QWidget* parent = nullptr, bool useRibbon = true, const Qt::WindowFlags flags = {});
~SARibbonMainWindow() Q_DECL_OVERRIDE;
// 返回SARibbonBar
SARibbonBar* ribbonBar() const;
// 设置ribbonbar
void setRibbonBar(SARibbonBar* ribbon);
#if !SARIBBON_USE_3RDPARTY_FRAMELESSHELPER
// 返回SAFramelessHelper
SAFramelessHelper* framelessHelper();
#else
// 如果ribbon中有自定义的窗口在标题栏等非点击区域加入后想能点击需要调用此接口告知可点击
void setFramelessHitTestVisible(QWidget* w, bool visible = true);
#endif
// 此函数仅用于控制最小最大化和关闭按钮的显示
void updateWindowFlag(Qt::WindowFlags flags);
// 注意主题在构造函数设置主题会不完全生效使用QTimer投放到队列最后执行即可
// QTimer::singleShot(0, this, [ this ]() { this->setRibbonTheme(SARibbonMainWindow::RibbonThemeDark); });
void setRibbonTheme(SARibbonTheme theme);
SARibbonTheme ribbonTheme() const;
// 判断当前是否使用ribbon模式
bool isUseRibbon() const;
// 把ribbonbar的事件传递到frameless
virtual bool eventFilter(QObject* obj, QEvent* e) Q_DECL_OVERRIDE;
// 获取最大化最小化关闭按钮所在的bar。可以通过此函数在最大最小化按钮旁边设置内容
SARibbonSystemButtonBar* windowButtonBar() const;
protected:
// 创建ribbonbar的工厂函数
SARibbonBar* createRibbonBar();
private Q_SLOTS:
void onPrimaryScreenChanged(QScreen* screen);
};
class SA_RIBBON_EXPORT SARibbonMainWindowEventFilter : public QObject
{
Q_OBJECT
public:
SARibbonMainWindowEventFilter(QObject* par);
virtual bool eventFilter(QObject* obj, QEvent* e) Q_DECL_OVERRIDE;
};
#endif // SARIBBONMAINWINDOW_H