From 4b0e69bd9aede057f519f5d71140d6f41a423314 Mon Sep 17 00:00:00 2001 From: czyt1988 Date: Fri, 15 Dec 2023 17:31:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme-cn.md | 21 ++++ src/SARibbonBar/SARibbonMainWindow.cpp | 30 ++++- src/SARibbonBar/SARibbonMainWindow.h | 7 +- src/SARibbonBar/SAWindowButtonGroup.cpp | 22 +++- src/SARibbonBar/resource.qrc | 13 ++- src/SARibbonBar/resource/Titlebar_Close.png | Bin 349 -> 0 bytes src/SARibbonBar/resource/Titlebar_Close.svg | 1 + .../resource/Titlebar_Close_Hover.png | Bin 325 -> 0 bytes .../resource/Titlebar_Close_Hover.svg | 1 + src/SARibbonBar/resource/Titlebar_Max.png | Bin 301 -> 0 bytes src/SARibbonBar/resource/Titlebar_Max.svg | 1 + .../resource/Titlebar_Max_Hover.svg | 1 + src/SARibbonBar/resource/Titlebar_Min.png | Bin 294 -> 0 bytes src/SARibbonBar/resource/Titlebar_Min.svg | 1 + .../resource/Titlebar_Min_Hover.svg | 1 + src/SARibbonBar/resource/Titlebar_Normal.png | Bin 325 -> 0 bytes src/SARibbonBar/resource/Titlebar_Normal.svg | 1 + .../resource/Titlebar_Normal_Hover.svg | 1 + src/SARibbonBar/resource/theme-dark.qss | 47 ++++---- src/SARibbonBar/resource/theme-office2013.qss | 45 +++++--- .../resource/theme-office2016-blue.qss | 46 ++++---- .../resource/theme-office2021-blue.qss | 46 ++++---- src/SARibbonBar/resource/theme-win7.qss | 61 ++++++----- src/example/CMakeLists.txt | 3 +- .../NormalMenuBarExample/CMakeLists.txt | 103 ++++++++++++++++++ 25 files changed, 331 insertions(+), 121 deletions(-) delete mode 100644 src/SARibbonBar/resource/Titlebar_Close.png create mode 100644 src/SARibbonBar/resource/Titlebar_Close.svg delete mode 100644 src/SARibbonBar/resource/Titlebar_Close_Hover.png create mode 100644 src/SARibbonBar/resource/Titlebar_Close_Hover.svg delete mode 100644 src/SARibbonBar/resource/Titlebar_Max.png create mode 100644 src/SARibbonBar/resource/Titlebar_Max.svg create mode 100644 src/SARibbonBar/resource/Titlebar_Max_Hover.svg delete mode 100644 src/SARibbonBar/resource/Titlebar_Min.png create mode 100644 src/SARibbonBar/resource/Titlebar_Min.svg create mode 100644 src/SARibbonBar/resource/Titlebar_Min_Hover.svg delete mode 100644 src/SARibbonBar/resource/Titlebar_Normal.png create mode 100644 src/SARibbonBar/resource/Titlebar_Normal.svg create mode 100644 src/SARibbonBar/resource/Titlebar_Normal_Hover.svg create mode 100644 src/example/NormalMenuBarExample/CMakeLists.txt diff --git a/readme-cn.md b/readme-cn.md index daf54728..0b96742d 100644 --- a/readme-cn.md +++ b/readme-cn.md @@ -171,6 +171,27 @@ SARibbon提供了合并好的`SARibbon.h`文件和`SARibbon.cpp`文件,只需 ..\..\..\SARibbon\src\SARibbonBar\3rdparty\framelesshelper\src\core\framelessmanager.cpp(563): fatal error C1083: 无法打开包括文件: “framelessmanager.moc”: No such file or directory ``` +### visual studio引入lib + +有些工程直接使用vs引入lib,而不是通过cmake和qmake来管理,这里介绍一下如何通过visual studio的界面引用库 + +在引入lib后,还需要做如下事情: + +1. 首先要在vs中添加include目录 + +``` +{yourPath}\include\SARibbon +{yourPath}\include\SARibbon\3rdparty\framelesshelper\include +{yourPath}\include\SARibbon\3rdparty\framelesshelper\qmake\inc\core +``` + +2. 前处理添加预定义宏 + +``` +SARIBBON_USE_3RDPARTY_FRAMELESSHELPER=1 +FRAMELESSHELPER_FEATURE_static_build=-1 +``` + # 使用方法 ## 引入库 diff --git a/src/SARibbonBar/SARibbonMainWindow.cpp b/src/SARibbonBar/SARibbonMainWindow.cpp index 9ceadefb..36f0be81 100644 --- a/src/SARibbonBar/SARibbonMainWindow.cpp +++ b/src/SARibbonBar/SARibbonMainWindow.cpp @@ -66,6 +66,8 @@ SARibbonMainWindow::SARibbonMainWindow(QWidget* parent, bool useRibbon, const Qt if (useRibbon) { installRibbonBar(createRibbonBar()); setRibbonTheme(ribbonTheme()); + } else { + setupNormalWindow(); } } @@ -108,6 +110,11 @@ bool SARibbonMainWindow::eventFilter(QObject* obj, QEvent* e) } return (QMainWindow::eventFilter(obj, e)); } +#else +FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessWidgetsHelper*) SARibbonMainWindow::framelessHelper() +{ + return FramelessWidgetsHelper::get(this); +} #endif /** * @brief 此函数仅用于控制最小最大化和关闭按钮的显示 @@ -259,9 +266,6 @@ void SARibbonMainWindow::installRibbonBar(SARibbonBar* bar) if (nullptr == d_ptr->mWindowButtonGroup) { d_ptr->mWindowButtonGroup = new SAWindowButtonGroup(this); } - QSize s = d_ptr->mWindowButtonGroup->sizeHint(); - s.setHeight(bar->titleBarHeight()); - d_ptr->mWindowButtonGroup->setFixedSize(s); d_ptr->mWindowButtonGroup->setWindowStates(windowState()); d_ptr->mWindowButtonGroup->show(); helper->setHitTestVisible(d_ptr->mWindowButtonGroup); // IMPORTANT! @@ -292,6 +296,22 @@ void SARibbonMainWindow::installRibbonBar(SARibbonBar* bar) #endif } +/** + @brief 构建为普通窗口 + */ +void SARibbonMainWindow::setupNormalWindow() +{ +#if SARIBBON_USE_3RDPARTY_FRAMELESSHELPER + auto helper = FramelessWidgetsHelper::get(this); + // 设置window按钮 + if (nullptr == d_ptr->mWindowButtonGroup) { + d_ptr->mWindowButtonGroup = new SAWindowButtonGroup(this); + } + d_ptr->mWindowButtonGroup->setWindowStates(windowState()); + d_ptr->mWindowButtonGroup->show(); +#endif +} + void sa_set_ribbon_theme(QWidget* w, SARibbonMainWindow::RibbonTheme theme) { QFile file; @@ -318,5 +338,7 @@ void sa_set_ribbon_theme(QWidget* w, SARibbonMainWindow::RibbonTheme theme) if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } - w->setStyleSheet(file.readAll()); + // 有反馈用qstring接住文件内容,再设置进去才能生效(qt5.7版本) + QString qss = file.readAll(); + w->setStyleSheet(qss); } diff --git a/src/SARibbonBar/SARibbonMainWindow.h b/src/SARibbonBar/SARibbonMainWindow.h index 1a38cf0d..aa62554a 100644 --- a/src/SARibbonBar/SARibbonMainWindow.h +++ b/src/SARibbonBar/SARibbonMainWindow.h @@ -7,6 +7,7 @@ #include "FramelessHelper/Widgets/framelessmainwindow.h" FRAMELESSHELPER_BEGIN_NAMESPACE class StandardTitleBar; +class FramelessWidgetsHelper; FRAMELESSHELPER_END_NAMESPACE #else class SAFramelessHelper; @@ -74,6 +75,8 @@ class SA_RIBBON_EXPORT SARibbonMainWindow : public QMainWindow SAFramelessHelper* framelessHelper(); // 把ribbonbar的事件传递到frameless virtual bool eventFilter(QObject* obj, QEvent* e) Q_DECL_OVERRIDE; +#else + FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessWidgetsHelper*) framelessHelper(); #endif // 此函数仅用于控制最小最大化和关闭按钮的显示 void updateWindowFlag(Qt::WindowFlags flags); @@ -83,7 +86,7 @@ class SA_RIBBON_EXPORT SARibbonMainWindow : public QMainWindow RibbonTheme ribbonTheme() const; // 判断当前是否使用ribbon模式 bool isUseRibbon() const; - //获取左上角按钮组(最大化,最小化,关闭) + // 获取左上角按钮组(最大化,最小化,关闭) SAWindowButtonGroup* windowButtonGroup() const; protected: @@ -95,6 +98,8 @@ class SA_RIBBON_EXPORT SARibbonMainWindow : public QMainWindow private: // 安装ribbon void installRibbonBar(SARibbonBar* bar); + // 构建为普通窗口 + void setupNormalWindow(); }; /** diff --git a/src/SARibbonBar/SAWindowButtonGroup.cpp b/src/SARibbonBar/SAWindowButtonGroup.cpp index 1d6f56ff..6408aa80 100644 --- a/src/SARibbonBar/SAWindowButtonGroup.cpp +++ b/src/SARibbonBar/SAWindowButtonGroup.cpp @@ -4,6 +4,8 @@ #include #include #include +#include "SARibbonMainWindow.h" +#include "SARibbonBar.h" #include "SARibbonElementManager.h" // 为了避免使用此框架的app设置了全局的qpushbutton 的 qss样式影响此按钮,定义了一个类 @@ -39,7 +41,7 @@ class SAWindowButtonGroup::PrivateData buttonMinimize->setObjectName(QStringLiteral("SAMinimizeWindowButton")); buttonMinimize->setFixedSize(30, par->height() - 2); buttonMinimize->setFocusPolicy(Qt::NoFocus); // 避免铺抓到 - buttonMinimize->setIconSize(buttonMinimize->size() * mIconscale); + // buttonMinimize->setIconSize(buttonMinimize->size() * mIconscale); buttonMinimize->show(); par->connect(buttonMinimize, &QAbstractButton::clicked, par, &SAWindowButtonGroup::minimizeWindow); } else { @@ -65,7 +67,7 @@ class SAWindowButtonGroup::PrivateData buttonMaximize->setFixedSize(30, par->height() - 2); buttonMaximize->setCheckable(true); buttonMaximize->setFocusPolicy(Qt::NoFocus); // 避免铺抓到 - buttonMaximize->setIconSize(buttonMaximize->size() * mIconscale); + // buttonMaximize->setIconSize(buttonMaximize->size() * mIconscale); buttonMaximize->show(); par->connect(buttonMaximize, &QAbstractButton::clicked, par, &SAWindowButtonGroup::maximizeWindow); } else { @@ -92,7 +94,7 @@ class SAWindowButtonGroup::PrivateData buttonClose->setFocusPolicy(Qt::NoFocus); // 避免铺抓到 // buttonClose->setFlat(true); par->connect(buttonClose, &QAbstractButton::clicked, par, &SAWindowButtonGroup::closeWindow); - buttonClose->setIconSize(buttonClose->size() * mIconscale); + // buttonClose->setIconSize(buttonClose->size() * mIconscale); buttonClose->show(); } else { if (buttonClose) { @@ -176,7 +178,9 @@ SAWindowToolButton::SAWindowToolButton(QWidget* p) : QPushButton(p) { setFlat(true); } - +//=================================================== +// SAWindowButtonGroup +//=================================================== SAWindowButtonGroup::SAWindowButtonGroup(QWidget* parent) : QWidget(parent), d_ptr(new SAWindowButtonGroup::PrivateData(this)) { @@ -344,7 +348,15 @@ bool SAWindowButtonGroup::eventFilter(QObject* watched, QEvent* e) 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); diff --git a/src/SARibbonBar/resource.qrc b/src/SARibbonBar/resource.qrc index 320501b8..42dbd038 100644 --- a/src/SARibbonBar/resource.qrc +++ b/src/SARibbonBar/resource.qrc @@ -4,14 +4,17 @@ resource/ArrowDown.png resource/ArrowMore.png resource/ArrowUp.png - resource/Titlebar_Close.png - resource/Titlebar_Close_Hover.png - resource/Titlebar_Max.png - resource/Titlebar_Min.png - resource/Titlebar_Normal.png resource/Titlebar_Shade.png resource/Titlebar_Unshade.png resource/define-color.svg + resource/Titlebar_Close.svg + resource/Titlebar_Close_Hover.svg + resource/Titlebar_Max.svg + resource/Titlebar_Max_Hover.svg + resource/Titlebar_Min.svg + resource/Titlebar_Min_Hover.svg + resource/Titlebar_Normal.svg + resource/Titlebar_Normal_Hover.svg resource/theme-win7.qss diff --git a/src/SARibbonBar/resource/Titlebar_Close.png b/src/SARibbonBar/resource/Titlebar_Close.png deleted file mode 100644 index 2a9c37464ae6a99bc6d2526dacc707350e72d5c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2ZGmxy8xzq=wSkfJR9T^xl_H+M9WCijSl0AZa z85pWm85kOx85n;42huMY7)lKo7+xhXFj&oCU=Yur6o1qWsFpv#C&cytf1nbEGiT1Q zvU330e6#CHfqcf2AirP+hi5m^K%69RcNc~ZR#^`qhqJ&VvY3H^TNs2H8D`Cq01C2~ zc>21sKjmO$l{XaM6Rrys()4t34B@z*ERd9t5ReiOmXKh?q^QvB7 \ No newline at end of file diff --git a/src/SARibbonBar/resource/Titlebar_Close_Hover.png b/src/SARibbonBar/resource/Titlebar_Close_Hover.png deleted file mode 100644 index 2a9a0d0a5d2a3757c627fea479eb909431b5390d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V3y@T|W;X*;Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhj)?e4 \ No newline at end of file diff --git a/src/SARibbonBar/resource/Titlebar_Max.png b/src/SARibbonBar/resource/Titlebar_Max.png deleted file mode 100644 index b3146f4fc3a905fde2e8978a053b9c481b644f78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V3y@T|W;X*;Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhj)?e4@cf*{CqT8TC9V-ADTyViR>?)FK#IZ0z{pV7z(Uu+ zD8$If%D}?P&`29d8W_yHXfzK+LvDUbW?CgegGq>yp_Q?rm5C)pgXZxWu|N$Bp00i_ I>zopr0D*^0ng9R* diff --git a/src/SARibbonBar/resource/Titlebar_Max.svg b/src/SARibbonBar/resource/Titlebar_Max.svg new file mode 100644 index 00000000..d0f03060 --- /dev/null +++ b/src/SARibbonBar/resource/Titlebar_Max.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SARibbonBar/resource/Titlebar_Max_Hover.svg b/src/SARibbonBar/resource/Titlebar_Max_Hover.svg new file mode 100644 index 00000000..e3238a09 --- /dev/null +++ b/src/SARibbonBar/resource/Titlebar_Max_Hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SARibbonBar/resource/Titlebar_Min.png b/src/SARibbonBar/resource/Titlebar_Min.png deleted file mode 100644 index 4c29eed32d638c154fe3f8c66dfd010116269717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V3y@T|W;X*;Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhj)?e4=G)e_f;l9a@fRIB8oR3OD*WME{dYha;kU=(6xWMyDs zWoV=gBn=E^UNoAAq9HdwB{QuOp}{1?$k58z(8|OTqCxZcj98!s22WQ%mvv4FO#l^Y BNxuL9 diff --git a/src/SARibbonBar/resource/Titlebar_Min.svg b/src/SARibbonBar/resource/Titlebar_Min.svg new file mode 100644 index 00000000..f6cfd192 --- /dev/null +++ b/src/SARibbonBar/resource/Titlebar_Min.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SARibbonBar/resource/Titlebar_Min_Hover.svg b/src/SARibbonBar/resource/Titlebar_Min_Hover.svg new file mode 100644 index 00000000..f9f4a7e2 --- /dev/null +++ b/src/SARibbonBar/resource/Titlebar_Min_Hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SARibbonBar/resource/Titlebar_Normal.png b/src/SARibbonBar/resource/Titlebar_Normal.png deleted file mode 100644 index b76c171d09a2fe6e1c24176865530dfddbf65e12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V3y@T|W;X*;Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhj)?e47Zr8VB~OIQ3atzd9W5Sf1_n=8KbLh*2~7YAjate8 diff --git a/src/SARibbonBar/resource/Titlebar_Normal.svg b/src/SARibbonBar/resource/Titlebar_Normal.svg new file mode 100644 index 00000000..e86f22d1 --- /dev/null +++ b/src/SARibbonBar/resource/Titlebar_Normal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SARibbonBar/resource/Titlebar_Normal_Hover.svg b/src/SARibbonBar/resource/Titlebar_Normal_Hover.svg new file mode 100644 index 00000000..c285a88a --- /dev/null +++ b/src/SARibbonBar/resource/Titlebar_Normal_Hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SARibbonBar/resource/theme-dark.qss b/src/SARibbonBar/resource/theme-dark.qss index b5c89567..099bb8da 100644 --- a/src/SARibbonBar/resource/theme-dark.qss +++ b/src/SARibbonBar/resource/theme-dark.qss @@ -313,47 +313,54 @@ SARibbonCategoryScrollButton[arrowType="4"] { border-left-width: 0.05em; } /*SAWindowToolButton*/ -SAWindowToolButton { - background-color: transparent; + +SAWindowToolButton { + background-color: transparent; border:none; } SAWindowToolButton:focus { outline: none; } - +/*Min*/ SAWindowToolButton#SAMinimizeWindowButton { - image: url(:/image/resource/Titlebar_Min.png); -} - -SAWindowToolButton#SAMaximizeWindowButton:checked { - image:url(:/image/resource/Titlebar_Normal.png); + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min.svg) center; } - -SAWindowToolButton#SAMaximizeWindowButton { - image:url(:/image/resource/Titlebar_Max.png); -} - SAWindowToolButton#SAMinimizeWindowButton:hover,#SAMaximizeWindowButton:hover { background-color: #e5e5e5; + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min_Hover.svg) center; } - SAWindowToolButton#SAMinimizeWindowButton:pressed,#SAMaximizeWindowButton:pressed { background-color: #cacacb; } +/*Max*/ +SAWindowToolButton#SAMaximizeWindowButton { + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Max.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:checked { + qproperty-icon: url(:/image/resource/Titlebar_Normal.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:hover { + background-color: #e5e5e5; + qproperty-icon: url(:/image/resource/Titlebar_Max_Hover.svg) center; +} + +/*Close*/ SAWindowToolButton#SACloseWindowButton { - image: url(:/image/resource/Titlebar_Close_Hover.png); + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Close.svg) center; } - SAWindowToolButton#SACloseWindowButton:hover { background-color: #e81123; - image: url(:/image/resource/Titlebar_Close.png); + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } - SAWindowToolButton#SACloseWindowButton:pressed { - background-color: #f1707a; - image: url(:/image/resource/Titlebar_Close.png); + background-color: #f1707a; + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } SAWindowToolButton#SARibbonBarHidePannelButton { diff --git a/src/SARibbonBar/resource/theme-office2013.qss b/src/SARibbonBar/resource/theme-office2013.qss index 04940334..063b5581 100644 --- a/src/SARibbonBar/resource/theme-office2013.qss +++ b/src/SARibbonBar/resource/theme-office2013.qss @@ -337,6 +337,9 @@ SARibbonCategoryScrollButton:hover { background-color: #cee7fc; } + +/*SAWindowToolButton*/ + SAWindowToolButton { background-color: transparent; border:none; @@ -345,39 +348,45 @@ SAWindowToolButton { SAWindowToolButton:focus { outline: none; } - +/*Min*/ SAWindowToolButton#SAMinimizeWindowButton { - image: url(:/image/resource/Titlebar_Min.png); -} - -SAWindowToolButton#SAMaximizeWindowButton:checked { - image:url(:/image/resource/Titlebar_Normal.png); + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min.svg) center; } - -SAWindowToolButton#SAMaximizeWindowButton { - image:url(:/image/resource/Titlebar_Max.png); -} - SAWindowToolButton#SAMinimizeWindowButton:hover,#SAMaximizeWindowButton:hover { background-color: #e5e5e5; + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min_Hover.svg) center; } - SAWindowToolButton#SAMinimizeWindowButton:pressed,#SAMaximizeWindowButton:pressed { background-color: #cacacb; } +/*Max*/ +SAWindowToolButton#SAMaximizeWindowButton { + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Max.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:checked { + qproperty-icon: url(:/image/resource/Titlebar_Normal.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:hover { + background-color: #e5e5e5; + qproperty-icon: url(:/image/resource/Titlebar_Max_Hover.svg) center; +} + +/*Close*/ SAWindowToolButton#SACloseWindowButton { - image: url(:/image/resource/Titlebar_Close.png); + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Close.svg) center; } - SAWindowToolButton#SACloseWindowButton:hover { background-color: #e81123; - image: url(:/image/resource/Titlebar_Close_Hover.png); + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } - SAWindowToolButton#SACloseWindowButton:pressed { - background-color: #f1707a; - image: url(:/image/resource/Titlebar_Close_Hover.png); + background-color: #f1707a; + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } SAWindowToolButton#SARibbonBarHidePannelButton { diff --git a/src/SARibbonBar/resource/theme-office2016-blue.qss b/src/SARibbonBar/resource/theme-office2016-blue.qss index a6dc6890..c90c6cc1 100644 --- a/src/SARibbonBar/resource/theme-office2016-blue.qss +++ b/src/SARibbonBar/resource/theme-office2016-blue.qss @@ -400,47 +400,53 @@ SARibbonSeparatorWidget { /*SAWindowToolButton*/ -SAWindowToolButton { - background-color: transparent; +SAWindowToolButton { + background-color: transparent; border:none; } SAWindowToolButton:focus { outline: none; } - +/*Min*/ SAWindowToolButton#SAMinimizeWindowButton { - image: url(:/image/resource/Titlebar_Min.png); -} - -SAWindowToolButton#SAMaximizeWindowButton:checked { - image:url(:/image/resource/Titlebar_Normal.png); + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min.svg) center; } - -SAWindowToolButton#SAMaximizeWindowButton { - image:url(:/image/resource/Titlebar_Max.png); -} - SAWindowToolButton#SAMinimizeWindowButton:hover,#SAMaximizeWindowButton:hover { background-color: #e5e5e5; + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min_Hover.svg) center; } - SAWindowToolButton#SAMinimizeWindowButton:pressed,#SAMaximizeWindowButton:pressed { background-color: #cacacb; } +/*Max*/ +SAWindowToolButton#SAMaximizeWindowButton { + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Max.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:checked { + qproperty-icon: url(:/image/resource/Titlebar_Normal.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:hover { + background-color: #e5e5e5; + qproperty-icon: url(:/image/resource/Titlebar_Max_Hover.svg) center; +} + +/*Close*/ SAWindowToolButton#SACloseWindowButton { - image: url(:/image/resource/Titlebar_Close.png); + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Close.svg) center; } - SAWindowToolButton#SACloseWindowButton:hover { background-color: #e81123; - image: url(:/image/resource/Titlebar_Close_Hover.png); + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } - SAWindowToolButton#SACloseWindowButton:pressed { - background-color: #f1707a; - image: url(:/image/resource/Titlebar_Close_Hover.png); + background-color: #f1707a; + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } SAWindowToolButton#SARibbonBarHidePannelButton { diff --git a/src/SARibbonBar/resource/theme-office2021-blue.qss b/src/SARibbonBar/resource/theme-office2021-blue.qss index 0bdb994e..6e978076 100644 --- a/src/SARibbonBar/resource/theme-office2021-blue.qss +++ b/src/SARibbonBar/resource/theme-office2021-blue.qss @@ -424,47 +424,53 @@ SARibbonSeparatorWidget { /*SAWindowToolButton*/ -SAWindowToolButton { - background-color: transparent; +SAWindowToolButton { + background-color: transparent; border:none; } SAWindowToolButton:focus { outline: none; } - +/*Min*/ SAWindowToolButton#SAMinimizeWindowButton { - image: url(:/image/resource/Titlebar_Min.png); -} - -SAWindowToolButton#SAMaximizeWindowButton:checked { - image:url(:/image/resource/Titlebar_Normal.png); + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min.svg) center; } - -SAWindowToolButton#SAMaximizeWindowButton { - image:url(:/image/resource/Titlebar_Max.png); -} - SAWindowToolButton#SAMinimizeWindowButton:hover,#SAMaximizeWindowButton:hover { background-color: #e5e5e5; + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min_Hover.svg) center; } - SAWindowToolButton#SAMinimizeWindowButton:pressed,#SAMaximizeWindowButton:pressed { background-color: #cacacb; } +/*Max*/ +SAWindowToolButton#SAMaximizeWindowButton { + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Max.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:checked { + qproperty-icon: url(:/image/resource/Titlebar_Normal.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:hover { + background-color: #e5e5e5; + qproperty-icon: url(:/image/resource/Titlebar_Max_Hover.svg) center; +} + +/*Close*/ SAWindowToolButton#SACloseWindowButton { - image: url(:/image/resource/Titlebar_Close.png); + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Close.svg) center; } - SAWindowToolButton#SACloseWindowButton:hover { background-color: #e81123; - image: url(:/image/resource/Titlebar_Close_Hover.png); + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } - SAWindowToolButton#SACloseWindowButton:pressed { - background-color: #f1707a; - image: url(:/image/resource/Titlebar_Close_Hover.png); + background-color: #f1707a; + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } SAWindowToolButton#SARibbonBarHidePannelButton { diff --git a/src/SARibbonBar/resource/theme-win7.qss b/src/SARibbonBar/resource/theme-win7.qss index 2a02738f..8aca1d44 100644 --- a/src/SARibbonBar/resource/theme-win7.qss +++ b/src/SARibbonBar/resource/theme-win7.qss @@ -306,50 +306,57 @@ SARibbonCategoryScrollButton[arrowType="4"] { } /*SAWindowToolButton*/ -SAWindowToolButton { - background-color: transparent; + +SAWindowToolButton { + background-color: transparent; border:none; } SAWindowToolButton:focus { outline: none; } - -#SAMinimizeWindowButton { - image: url(:/image/resource/Titlebar_Min.png); -} - -#SAMaximizeWindowButton:checked { - image:url(:/image/resource/Titlebar_Normal.png); -} - -#SAMaximizeWindowButton { - image:url(:/image/resource/Titlebar_Max.png); +/*Min*/ +SAWindowToolButton#SAMinimizeWindowButton { + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min.svg) center; } - -#SAMinimizeWindowButton:hover,#SAMaximizeWindowButton:hover { +SAWindowToolButton#SAMinimizeWindowButton:hover,#SAMaximizeWindowButton:hover { background-color: #e5e5e5; + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Min_Hover.svg) center; } - -#SAMinimizeWindowButton:pressed,#SAMaximizeWindowButton:pressed { +SAWindowToolButton#SAMinimizeWindowButton:pressed,#SAMaximizeWindowButton:pressed { background-color: #cacacb; } - -#SACloseWindowButton { - image: url(:/image/resource/Titlebar_Close.png); +/*Max*/ +SAWindowToolButton#SAMaximizeWindowButton { + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Max.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:checked { + qproperty-icon: url(:/image/resource/Titlebar_Normal.svg) center; +} +SAWindowToolButton#SAMaximizeWindowButton:hover { + background-color: #e5e5e5; + qproperty-icon: url(:/image/resource/Titlebar_Max_Hover.svg) center; } -#SACloseWindowButton:hover { + +/*Close*/ +SAWindowToolButton#SACloseWindowButton { + qproperty-iconSize: 16px 16px; + qproperty-icon: url(:/image/resource/Titlebar_Close.svg) center; +} +SAWindowToolButton#SACloseWindowButton:hover { background-color: #e81123; - image: url(:/image/resource/Titlebar_Close_Hover.png); + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } - -#SACloseWindowButton:pressed { - background-color: #f1707a; - image: url(:/image/resource/Titlebar_Close_Hover.png); +SAWindowToolButton#SACloseWindowButton:pressed { + background-color: #f1707a; + qproperty-icon: url(:/image/resource/Titlebar_Close_Hover.svg) center; } -#SARibbonBarHidePannelButton { +SAWindowToolButton#SARibbonBarHidePannelButton { titlebar-shade-icon: url(:/image/resource/Titlebar_Shade.png); titlebar-unshade-icon: url(:/image/resource/Titlebar_Unshade.png); } diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt index 652c6d53..c9706228 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.5) project(SARibbonExamples LANGUAGES CXX) add_subdirectory(MainWindowExample) -add_subdirectory(WidgetWithRibbon) \ No newline at end of file +add_subdirectory(WidgetWithRibbon) +add_subdirectory(NormalMenuBarExample) diff --git a/src/example/NormalMenuBarExample/CMakeLists.txt b/src/example/NormalMenuBarExample/CMakeLists.txt new file mode 100644 index 00000000..5c4e9996 --- /dev/null +++ b/src/example/NormalMenuBarExample/CMakeLists.txt @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 3.5) +SET(VERSION_SHORT 0.1) +project(NormalMenuBarExample VERSION ${VERSION_SHORT}) +set(SARIBBON_EXPAMPLE_NAME NormalMenuBarExample) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +# 显示定义FRAMELESSHELPER_FEATURE_static_build为-1 否则库引用会失败 +add_definitions(-DFRAMELESSHELPER_FEATURE_static_build=-1) +# qt库加载,最低要求5.9 +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} 5.9 COMPONENTS Core Gui Widgets REQUIRED) + +# 在加载qt版本后,需要下面这段开判断是否使用framelss +# 根据qt版本选择是否使用frameless库,目前frameless库支持qt5.14,qt5.15,qt6.4+,除了上诉版本,都使用不了 +function(setup_custom_moc_macros) + cmake_parse_arguments(arg "" "" "TARGETS" ${ARGN}) + if(arg_UNPARSED_ARGUMENTS) + message(AUTHOR_WARNING "setup_custom_moc_macros: Unrecognized arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + foreach(__target ${arg_TARGETS}) + if(NOT TARGET ${__target}) + message(AUTHOR_WARNING "${__target} is not a valid CMake target!") + continue() + endif() + set_property(TARGET ${__target} APPEND PROPERTY AUTOMOC_MACRO_NAMES "FRAMELESSHELPER_QT_CLASS;FRAMELESSHELPER_PUBLIC_QT_CLASS;FRAMELESSHELPER_PRIVATE_QT_CLASS") + endforeach() +endfunction() +if(${QT_VERSION_MAJOR} EQUAL 5) + # qt版本为5,判断是否小版本大于14 + if(${QT_VERSION_MINOR} GREATER_EQUAL 14) + #5.14和5.15可以使用frameless + set(SARIBBON_USE_FRAMELESS_LIB ON) + else() + set(SARIBBON_USE_FRAMELESS_LIB OFF) + endif() +elseif(${QT_VERSION_MAJOR} EQUAL 6) + # qt版本为6,判断是否小版本大于4 + if(${QT_VERSION_MINOR} GREATER_EQUAL 4) + #6.4及以上可以使用frameless + set(SARIBBON_USE_FRAMELESS_LIB ON) + else() + set(SARIBBON_USE_FRAMELESS_LIB OFF) + endif() +endif() +if(SARIBBON_USE_FRAMELESS_LIB) + #使用frameless必须设置SARIBBON_USE_3RDPARTY_FRAMELESSHELPER宏为1 + add_definitions(-DSARIBBON_USE_3RDPARTY_FRAMELESSHELPER=1) + setup_custom_moc_macros(TARGETS ${SARIBBON_EXPAMPLE_NAME}) +else() + #不使用frameless必须设置SARIBBON_USE_3RDPARTY_FRAMELESSHELPER宏为0 + add_definitions(-DSARIBBON_USE_3RDPARTY_FRAMELESSHELPER=0) +endif() + + + +add_executable(${SARIBBON_EXPAMPLE_NAME} + MainWindow.h + MainWindow.cpp + MainWindow.ui + main.cpp +) + +target_include_directories(${SARIBBON_EXPAMPLE_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../SARibbonBar") + +target_link_libraries(${SARIBBON_EXPAMPLE_NAME} PRIVATE SARibbonBar) +target_link_libraries(${SARIBBON_EXPAMPLE_NAME} PUBLIC + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Widgets) + +set_target_properties(${SARIBBON_EXPAMPLE_NAME} PROPERTIES + AUTOMOC ON + AUTORCC ON + AUTOUIC ON + CXX_EXTENSIONS OFF + DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX} + VERSION ${SARIBBON_VERSION} + EXPORT_NAME ${SARIBBON_EXPAMPLE_NAME} + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" +) + +install(TARGETS ${SARIBBON_EXPAMPLE_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION bin ARCHIVE DESTINATION lib) + +# 会有一个FAILED: src/example/MainWindowExample/CMakeFiles/MainWindowExample.dir/MainWindowExample.rc.res +# 暂时注释 +# +# if(WIN32) +# add_custom_command(TARGET ${SARIBBON_EXPAMPLE_NAME} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} -E +# copy_if_different +# "$" +# "$" +# ) +# create_win32_resource_version( +# TARGET ${SARIBBON_EXPAMPLE_NAME} +# FILENAME ${SARIBBON_EXPAMPLE_NAME} +# EXT "exe" +# DESCRIPTION "Example application for Qt Ribbon Control" +# ) +# visual_studio_qt_helper(${SARIBBON_EXPAMPLE_NAME}) +# endif()