中文文档点击这里,QQ群:434014314
Windows(2019,最新) | Linux ubuntu(20.04,最新) | Mac(11-最新) | |
---|---|---|---|
Qt5.12 | |||
Qt5.13 | |||
Qt5.14 | |||
Qt5.15 | |||
Qt6.0 | |||
Qt6.1 | |||
Qt6.2 | |||
Qt6.3 | |||
Qt6.4 | |||
Qt6.5 | |||
Qt6.6 |
这是Qt
框架下的Ribbon control
,提供了类似于Microsoft Office软件的界面。 SARibbon
适用于大型软件、工业软件、复杂的软件UI。 SARibbon
的设计参考了MFC Ribbon界面的命名风格,而SARibbon
的界面风格参考了Microsoft Office系列软件和WPS软件的Ribbon界面,并结合了两者的优点。 SARibbon
是一个可以定义多种主题风格的ribbon widget,通过qss可以快速定义你想要的主题风格。为了方便大型软件的开发, SARibbon
封装了一些常用的功能控件,比如Color Widgets
win7主题: Office2013主题: Office2016主题: Office2021主题: 黑暗主题:
MIT协议,欢迎大家使用并提出意见
gitee - https://gitee.com/czyt1988/SARibbon
github - https://github.com/czyt1988/SARibbon
SARibbon
提供 qmake 和 cmake 构建方法,并提供合并的SARibbon.h
和SARibbon.cpp
文件,用于静态嵌入到单个项目中
SARibbon
支持第三方库 QWindowKit 同时也支持简单的无框架解决方案。如果需要操作系统原生的窗口支持,比如Windows 7之后的修边以及Windows 11中最大化按钮的悬停效果,建议启用QWindowKit Library,QWindowKit Library可以更好的解决多屏移动的问题
如果要依赖 QWindowKit 库,需要先编译 QWindowKit 库,QWindowKit 作为 SARibbon 项目的子模块,如果 'git clone' 中不包含 '--recursive' 参数,则执行 'submodules update' 命令需要执行:
git submodule update --init --recursive
详细的构建过程可以参考文档:Building SARibbon
SARibbon提供了合并的SARibbon.h
文件和SARibbon.cpp
文件,您只需在自己的项目中导入这两个文件,同时导入资源文件和第三方库文件即可使用,无需编译成动态库或者静态库,可以参考 StaticExample 示例(位于src/example/StaticExample
),静态嵌入将用于SARibbon.h
, SARibbon.cpp
、 SARibbon.pri
、 SARibbonBar/resource.qrc
和SARibbonBar/3rdparty
、 SARibbonBar/resource
两个文件夹:
您的项目目录将如下所示:
|-you-project-dir
| |-you-project.pro
| |-SARibbon.h
| |-SARibbon.cpp
| |-SARibbon.pri
| |-SARibbonBar
| |-resource.qrc
| |-resource(Directly copy the resource under SARibbonBar in its entirety)
| |-resource files
要使用qmake编译,可以按照以下步骤操作:
SARibbon.h
、 SARibbon.cpp
、 SARibbon.pri
复制到您的项目目录SARibbonBar
文件夹src/SARibbonBar/resource.qrc
文件复制到项目目录下的SARibbonBar
文件夹中src/SARibbonBar
下的resource
文件夹复制到项目目录下的SARibbonBar
文件夹中SARibbon.pri
文件导入到项目的 pro 文件中,例如include($$PWD/SARibbon.pri)
如果使用cmake,请参考StaticExample示例的cmake编写方法(位于src/example/StaticExample
)
编译完成后,导入SARibbon,如下:
如果使用qmake,编译完成后只需将以下文件复制到项目的目录结构中即可
先在你的项目中创建一个3rdparty文件夹,然后复制整个SARibbon文件夹,SARibbon内部已经有几个pri文件可以方便的让你将项目导入到自己的目录中, ./importSARibbonBarLib.pri
importSARibbonBarLib.pri文件用于导入SARibbon库
完成申诉流程后,您可以将以下语句添加到您的 Qt 项目 pro 文件中
include( $$ PWD/3rdparty/SARibbon/importSARibbonBarLib.pri)
qmake的编译过程会在SARibbon下生成bin_qtx.x_xx文件夹,库文件和dll文件都在该文件夹中, importSARibbonBarLib.pri
会自动引用该文件夹中的库
此时,您的项目目录如下所示:
|-[you-project-dir]
| |-you-project.pro
| |-[3rdparty]
| |-[SARibbon](Copy SARibbon in its entirety)
| |-importSARibbonBarLib.pri
| |-SARibbonBar.pri
| |-common.pri
| |-[bin_qtx.x.x_{MSVC/GNU}_x{32/64}]
| |-[src]
| | |-[SARibbonBar]
建议执行install
后使用该库。
引入cmake的方法:
find_package (SARibbonBar REQUIRED)
...
target_link_libraries ({your_target_name} PUBLIC SARibbonBar::SARibbonBar)
如果find_package
找不到SARibbonBar
,您需要告知您的 cmake 项目SARibbon
的安装位置。
set(SARibbonBar_DIR "[your SARibbonBar installation root directory]/lib/cmake")
如果编译时将SARIBBON_INSTALL_IN_CURRENT_DIR
选项设置为ON
(默认),则会在 SARibbon 项目根目录下生成一个bin_qt{Qt version}_{MSVC/GNU}_x{32/64}
文件夹作为安装目录。这是为了与 qmake 保持一致,并方便在单个操作系统上安装多个不同版本的 Qt 和编译器。否则,在 Windows 上,它将默认安装在C:Program FilesSARibbonBar
文件夹中。
有关通过 cmake 引入 SARibbon 的参考,请参阅src/example/MainWindowExample/CMakeLists.txt
。
详细参考文档:SARibbon Building
Ribbon是菜单栏和工具栏的组合,并通过选项卡控件来显示,Ribbon不能简单地用Tab+Toolbar来代替,涉及到很多细节, SARibbon
在设计中参考了MFC Ribbon界面的命名风格,标签页称为Category
,每个Category
下有多个pannel
,下面管理工具按钮, pannel
有点像传统的Toolbar
,层次结构如下图所示,这些名字分别是引用 MFC 功能区界面类
一些常见名词解释如下
Category ,表示标签所呈现的内容,对应于SARibbonCategory
。
Context Category ,这是一个特殊的类别。无法正常显示。需要根据上下文来判断是否应该显示。最常见的方式是在word中插入图片后,会出现一个与图片修改相关的标签。如果没有选择图片,标签将会消失。这是上下文类别,对应于SARibbonContextCategory
。
Pannel ,这是菜单的集合,就像一个 Toolbar,对应SARibbonPannel
应用程序按钮,这是标签栏最左边的按钮(word 是对应的文件按钮)。该按钮会触发一些特殊的页面或菜单,对应SARibbonApplicationButton
,可以隐藏。
快速访问栏,顶部的一个简单工具栏,用于放置与SARibbonQuickAccessBar
相对应的常见操作。
Gallery Control ,这是ribbon中最引人注目的控件。它以直观的图像显示功能,甚至有些渲染是根据上下文实时完成的。典型的例子就是office word中的风格选择。对应于SARibbonGallery
。
SARibbonBar的布局如下图所示
注意:不同的布局方案会影响
Category
和Quick Access Bar
的位置
要在 MainWindow 中使用 SARibbon,需要将QMainWindow
替换为SARibbonMainWindow
,这会修改QMainWindow
渲染菜单栏的方式
注意,如果使用UI文件,应该删除UI文件的菜单,否则可能会导致一些异常
示例代码如下:
# include " SARibbonMainWindow.h "
class MainWindow : public SARibbonMainWindow
{
Q_OBJECT
public:
MainWindow (QWidget* par = nullptr );
...
}
SARibbonMainWindow
还支持使用以下构造函数的正常模式渲染:
SARibbonMainWindow (QWidget *parent = nullptr , bool useRibbon = true );
如果第二个参数设置为false,则会使用普通菜单工具栏模式,此接口是为一些需要能够在ribbon和经典菜单工具栏场景之间切换的项目保留的,ribbon状态和classic状态不支持热切换,如果需要切换,可以设置一个配置文件或者注册表,应用重启时给第二个参数传递false即可进入经典菜单工具栏模式
SARibbonBar
可以在QWidget
或QDialog
上使用,参见示例: src/example/WidgetWithRibbon
您所需要做的就是使用SARibbonBar
作为普通小部件
首先在头文件中声明SARibbonBar
的指针
private:
Ui::Widget* ui;
SARibbonBar* mRibbonBar { nullptr };
在Widget的构造函数中创建一个SARibbonBar
,在Widget的ui文件中有一个QVBoxLayout
布局,将SARibbonBar
放置在最顶部,同时由于QWidget模式,不需要显示标题,可以调用SARibbonBar::setTitleVisible
方法隐藏标题。如果不需要,也可以在 QWidget 中通过SARibbonBar::setApplicationButton
取消 applicationButton,最后由于 SARibbonBar 的主题是在SARibbonMainWindow
方法中设置的,所以可以在 QWidget 中通过全局函数sa_set_ribbon_ theme
设置主题
# include " SARibbonBar.h "
# include " SARibbonCategory.h "
# include " SARibbonPannel.h "
# include " SARibbonMainWindow.h "
Widget::Widget (QWidget* parent) : QWidget(parent), ui( new Ui::Widget)
{
// Note: There is a QVBoxLayout layout in the ui file
ui-> setupUi ( this );
// Create SARibbonBar
mRibbonBar = new SARibbonBar ( this );
// there is no need to display the title anymore on QWidget
mRibbonBar -> setTitleVisible ( false );
// it is better to use compact mode directly on QWidget
mRibbonBar -> setRibbonStyle (SARibbonBar::RibbonStyleCompactThreeRow);
// cancel applicationbutton
mRibbonBar -> setApplicationButton ( nullptr );
// Set the theme, although SARibbonMainWindow is not used here,
// but the theme of the Ribbon is defined in SARibbonMainWindow, so SARibbonMainWindow.h should be introduced
sa_set_ribbon_theme ( mRibbonBar , SARibbonMainWindow::RibbonThemeOffice2013);
// QWidgets sets a QVBoxLayout and puts the window in the second layout of the QVBoxLayout,
// and the first layout is given to SARibbonBar, so that SARibbonBar will be on top
ui-> verticalLayout -> insertWidget ( 0 , mRibbonBar );
buildRibbon ( mRibbonBar );
}
它看起来是这样的:
创建功能区的顺序是创建类别,然后创建面板,最后创建工具按钮(操作)
使用SARibbonBar::addCategoryPage
将类别添加到 SARibbonBar, SARibbonCategory::addPannel
添加类别,使用SARibbonPannel::addAction
将操作添加到 Pannel
以下代码演示了添加操作的示例:
// Add main tab - The main tab is added through the addcategorypage factory function.
SARibbonCategory* categoryMain = ribbon-> addCategoryPage (tr( " Main " ));
// Using the addpannel function to create saribponpannel. The effect is the same as that of new saribponpannel, and then call SARibbonCategory:: addpannel.
SARibbonPannel* pannel1 = categoryMain-> addPannel (( " Panel 1 " ));
QAction* actSave = new QAction( this );
actSave-> setText ( " save " );
actSave-> setIcon (QIcon( " :/icon/icon/save.svg " ));
actSave-> setObjectName ( " actSave " );
actSave-> setShortcut (QKeySequence(QLatin1String( " Ctrl+S " )));
pannel1-> addLargeAction (actSave);
上述操作添加了一个按钮,效果如下图所示:
你也可以直接new出SARibbonCategory
并将其添加到pannel中,下面的代码看起来与上面的代码相同:
SARibbonCategory* categoryMain = new SARibbonCategory(tr( " Main " ));
ribbon-> addCategoryPage (categoryMain);
SARibbonPannel* pannel1 = new SARibbonPannel( " Panel 1 " );
categoryMain-> addPannel (pannel1);
QAction* actSave = new QAction( this );
...
pannel1-> addLargeAction (actSave);
可以通过addLargeAction
、 addMediumAction
、 addSmallAction
组合不同的布局样式。详情请参阅:
./src/example/MainWindowExample/mainwindow.cpp
所谓Context Category,是指只有在特殊情况下才会出现的标签/标签组。例如office word选择图片时,会出现图片编辑的Context Category,如下图:
SARibbon中Context Category对应的类是SARibbonContextCategory
上下文类别通常在程序初始化时创建。通常是隐藏的,需要显示的时候才显示。上下文类别创建如下:
由于Context Category在使用时需要调用,所以用成员变量来保存是一个不错的选择。当然,你也可以遍历搜索( SARibbonBar::contextCategoryList
可以枚举所有SARibbonContextCategory
)。
头文件:
SARibbonContextCategory* m_contextCategory;
.cpp 文件:
SARibbonBar* ribbon = ribbonBar();
// Create a contextCategory with random colors
m_contextCategory = ribbon-> addContextCategory (tr( " context " ), QColor());
SARibbonCategory* contextCategoryPage1 = m_contextCategory-> addCategoryPage (tr( " Page1 " ));
// Operate on contextCategoryPage1
......
SARibbonCategory* contextCategoryPage2 = m_contextCategory-> addCategoryPage (tr( " Page2 " ));
// Operate on contextCategoryPage2
......
由SARibbonContextCategory
创建的SARibbonCategory
由SARibbonContextCategory
管理。仅当显示SARibbonContextCategory
时,才会显示托管的SARibbonCategory
注意: SARibbonContextCategory
不是一个小部件。
显示上下文使用
SARibbonBar::showContextCategory
/ SARibbonBar::hideContextCategory
:
void MainWindow::onShowContextCategory ( bool on)
{
if (on) {
this -> ribbonBar ()-> showContextCategory (m_contextCategory);
} else {
this -> ribbonBar ()-> hideContextCategory (m_contextCategory);
}
}
**注意:** 如果要删除contextCategory
,需要调用SARibbonBar::destroyContextCategory
而不是直接删除。调用SARibbonBar::destroyContextCategory
后,不需要删除 ContextCategory 的指针。
不同的上下文类别有不同的风格。详情参见:[SARibbon样式](#SARibbon样式)和[不同样式下显示比较](#不同样式下显示比较)。
在功能区界面的左上角有一个特殊且明显的按钮,称为ApplicationButton
。该按钮一般用于调出菜单。 SAribbonBar 在构造过程中默认创建ApplicationButton
。其文本可以通过以下方式设置:
SARibbonBar* ribbon = ribbonBar();
ribbon-> applicationButton ()->setText(( " File " ));
默认的 applicationButton 继承自SARibbonApplicationButton
,而SARibbonApplicationButton
继承自QPushButton
,因此您可以对QPushButton
执行所有操作。当然,如果您想将自己的Button设置为applicationButton,只需调用SARibbonBar::setApplicationButton
函数即可。
QuickAccessBar 是左上角的快速工具栏,rightButtonGroup 是右上角的快速工具栏。办公模式下,分为左右两侧。在WPS模式下,左右两侧将合并并放置在右侧。
在SARibbon
中:
SARibbonQuickAccessBar
类。SARibbonQuickAccessBar
类。在初始化过程中, SARibbonBar
将默认创建 QuickAccessBar 和 RightButtonGroup。它的指针可以通过SARibbonBar::quickAccessBar
和SARibbonBar::rightButtonGroup
获取。举例如下:
QAction* MainWindow::createAction ( const QString& text, const QString& iconurl, const QString& objName)
{
QAction* act = new QAction ( this );
act-> setText (text);
act-> setIcon ( QIcon (iconurl));
act-> setObjectName (objName);
return act;
}
void MainWindow::initQuickAccessBar (){
SARibbonBar* ribbon = ribbonBar ();
SARibbonQuickAccessBar* quickAccessBar = ribbon-> quickAccessBar ();
quickAccessBar-> addAction ( createAction ( " save " , " :/icon/icon/save.svg " , " save-quickbar " ));
quickAccessBar-> addSeparator ();
quickAccessBar-> addAction ( createAction ( " undo " , " :/icon/icon/undo.svg " ), " undo " );
quickAccessBar-> addAction ( createAction ( " redo " , " :/icon/icon/redo.svg " ), " redo " );
quickAccessBar-> addSeparator ();
}
void MainWindow::initRightButtonGroup (){
SARibbonBar* ribbon = ribbonBar ();
SARibbonButtonGroupWidget* rightBar = ribbon-> rightButtonGroup ();
QAction* actionHelp = createAction ( " help " , " :/icon/icon/help.svg " , " help " );
connect (actionHelp, &QAction::triggered, this , &MainWindow::onActionHelpTriggered);
rightBar-> addAction (actionHelp);
}
SARibbon
支持四种功能区样式之间的切换。这里参考的是office
和WPS
的功能区样式。可以通过void SARibbonBar::setRibbonStyle(RibbonStyle v)
实现在线样式切换。
office
模式是最常见的功能区模式, tab
和标题栏占用较多空间, WPS
对功能区模式进行了改进,降低了功能区的高度,将标签和标题栏设置在一起,从而降低标题栏高度,有效利用垂直空间,同时面板按钮布局由最多3个改为2个,进一步压缩垂直空间
Office Word界面与WPS Word界面截图对比
普通屏幕下,WPS风格会比Office风格减少至少30个像素的垂直高度,相当于比1920*1080屏幕节省近3%的垂直空间。
在SARibbon中,带有标题栏的称为Loose,松散布局的元素排列如下图:
此布局与Office默认布局一致
在SARibbon中,带有标题栏和选项卡的布局称为紧凑布局,紧凑布局的元素排列如下:
SARibbonBar 提供了setRibbonStyle
函数定义当前的布局样式,枚举SARibbonBar::RibbonStyle
定义了四种布局方案:
SARibbonBar::RibbonStyleLooseThreeRow
宽松三行(v0.x 版本为SARibbonBar::OfficeStyle
) SARibbonBar::RibbonStyleLooseTwoRow
两行宽松(v0.x 版本为SARibbonBar::OfficeStyleTwoRow
) SARibbonBar::RibbonStyleCompactThreeRow
紧凑型三行(v0.x 版本为SARibbonBar::WpsLiteStyle
) SARibbonBar::RibbonStyleCompactTwoRow
紧凑型两行(v0.x 版本为SARibbonBar::WpsLiteStyleTwoRow
) SARibbonBar::setEnableWordWrap
函数可以让你控制SARibbonBar的文字是否换行, SARibbonBar
的高度是固定的,文字是否换行会影响图标显示的大小,所以如果你想要图标为了看起来更大,您可以将文本设置为不换行
在SARibbonBar::RibbonStyleCompactTwoRow
布局样式中,不换行的文本显示如下:
SARibbonBar::RibbonStyleCompactTwoRow
结构结构,2行模式把文字设置为不换行后( SARibbonBar::setEnableWordWrap(false)
) 的效果如下
当SARibbonBar文本设置为非换行时,图标的显示空间变大
SARibbonPannel
提供了三种添加操作的方法:
addLargeAction
addMediumAction
addSmallAction
在标准面板中,一个动作(按钮)具有三种布局模式。以office word为例,pannel的三种布局实际上就是占用的行数:
SARibbonPannelItem::RowProportion
用于表示每个表单在面板中占据的行数。它常用于面板布局中。该枚举定义如下:
/* *
* @brief defines the proportion of rows. The ribbon has three proportions: large, media and small.
*/
enum RowProportion {
None // /< to define the proportion, it will be judged according to expandingDirections. If Qt::Vertical is available, it is equal to Large, otherwise it is Small
, Large // /< Large proportion, the height of a widget will fill the whole pannel.
, Medium // /< Medium proportion will only work when @ref SARibbonPannel::pannelLayoutMode is @ref SARibbonPannel::ThreeRowMode, and will occupy two of the three rows if both of them in the same column are Medium.
, Small // /< Small proportion, in the line of SARibbonPannel, Medium will become Small if it does not meet the conditions, but will not become Large.
};
SARibbonPannel
中管理的每个操作都将拥有一个私有属性 ( SARibbonPannelItem::RowProportion
)。该属性决定了该操作在面板中的布局。
SARibbonPannel
布局模式三行模式是传统的面板布局,如下图所示:
3行模式下,占位符有大、中、小三种
3行模式下的面板会在Pannel Title区域显示面板的标题,另外还有一个OptionAction区域。该区域用于为此操作添加特殊触发器。如果未设置OptionAction,则该区域被隐藏。
两行模式是WPS改进的布局方法,如下图所示:
2行模式下,中、小占位符(SARibbonPannelItem::RowProportion)是相同的,不做区分。
在2行模式下,pannel不显示标题。
功能区定制是功能区的一个功能。参考office和WPS的自定义界面,用户可以为自己的ribbon定义很多内容,甚至定义一个与原来完全不同的界面。
以下是office的自定义界面。
SARibbon参考了office和WPS的接口,封装了简单易用的SARibbonCustomize**
类,包括以下五个类:
SARibbonCustomizeDialog
SARibbonCustomizeWidget
SARibbonCustomizeData
SARibbonActionsManager
SARibbonActionsManagerModel
实际用户只能使用SARibbonActionsManager
和SARibbonCustomizeDialog
/ SARibbonCustomizeWidget
,其他用户不会正常使用它们。
SARibbonActionsManager
用于管理QAction
,将需要自定义的QAction
添加到SARibbonActionsManager
中进行管理,并对QAction
进行分类,以便可以在SARibbonCustomizeDialog
/ SARibbonCustomizeWidget
中显示。
SARibbonCustomizeDialog
/ SARibbonCustomizeWidget
是一个具体的显示窗口。 SARibbonCustomizeDialog
将SARibbonCustomizeWidget
封装为对话框。如果你想将其集成到像office一样的配置对话框中,你可以使用SARibbonCustomizeWidget
。 SARibbonCustomizeDialog
的效果如下图所示:
以下是添加自定义功能的方法。
首先,将SARibbonActionsManager
定义为MainWindow
的成员变量。
// Define member variables in the MainWindow.h.
SARibbonActionsManager* m_ribbonActionMgr; // /< Manage all actions
在MainWindow
初始化过程中,需要创建大量的QAction
。 QAction
的父对象被指定为MainWindow
。另外,还会生成ribbon布局,如添加类别、添加面板等操作。完成上述操作后,添加以下步骤,自动让SARibbonActionsManager
管理所有QAction
。
// Initialization of MainWindow and generation of QAction.
// Generate ribbon layout.
m_ribbonActionMgr = new SARibbonActionsManager(mainWinowPtr);
m_ribbonActionMgr-> autoRegisteActions (mainWinowPtr);
SARibbonActionsManager
的关键函数autoRegisteActions
可以遍历SARibbonMainWindow
下的所有子对象,查找并注册 action,并遍历所有SARibbonCategory
。 SARibbonCategory
下的操作根据SARibbonCategory
的标题名称进行分类。此函数还将操作注册在SARibbonMainWindow
下,但不注册在任何类别下,作为“NotInRibbonCategoryTag”标签,默认名称为“not in Ribbon”。
要调用 SARibbonCustomizeDialog,如下所示:
QString cfgpath = " customization.xml " ;
SARibbonCustomizeDialog dlg ( this , this );
dlg.setupActionsManager(m_ribbonActionMgr);
dlg.fromXml(cfgpath); // This step is called to load the existing custom steps, which can be added based on the original custom steps when saving.
if (QDialog::Accepted == dlg.exec()) {
dlg. applys (); // Apply custom steps
dlg. toXml (cfgpath); // Save custom steps to a file
}
在生成MainWindow之前,需要加载自定义的内容。因此,应在构造函数中添加以下语句:
// Constructor of MainWindow
sa_apply_customize_from_xml_file ( " customization.xml " , this , m_ribbonActionMgr);
sa_apply_customize_from_xml_file
是SARibbonCustomizeWidget.h
中提供的函数。配置文件中的自定义内容直接应用到主窗口中。
这样,软件每次启动时都会根据配置文件进行加载。
github - https://github.com/czyt1988/data-workbench
gitee - https://gitee.com/czyt1988/data-workbench
具体ribbon生成代码可见:
https://github.com/czyt1988/data-workbench/blob/master/src/APP/DAAppRibbonArea.cpp
对于高DPI屏幕显示问题有两种准备方法:
QApplication
设置Qt::AA_EnableHighDpiScaling
该属性使应用程序能够自动检测显示器的像素密度以实现自动缩放,例如:
int main ( int argc, char * argv[])
{
# if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
QApplication::setAttribute (Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute (Qt::AA_UseHighDpiPixmaps);
# endif
QApplication a (argc, argv);
......
}
QApplication
的缩放策略: QApplication::setHighDpiScaleFactorRoundingPolicy
Qt5.6提供了Qt::AA_EnableHighDpiScaling
,但并不能完全解决高DPI屏幕的问题。 Qt5.14已经提供了高dpi屏幕缩放策略设置,名为QApplication::setHighDpiScaleFactorRoundingPolicy
,同样需要在主函数中设置,例如:
int main ( int argc, char * argv[])
{
# if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
QApplication::setAttribute (Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute (Qt::AA_UseHighDpiPixmaps);
# endif
# if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QApplication::setHighDpiScaleFactorRoundingPolicy (Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
# endif
QApplication a (argc, argv);
......
}
经常有人反馈使用SARibbonBar后,非活动标签页的快捷键没有响应,只有激活标签页的快捷键有响应。如果是传统工具栏模式,快捷键仍然有效,因为动作所在的工具栏始终位于最前面。但如果是SARibbonBar,操作面板中的快捷键会被隐藏,隐藏后不会生效,如果想让快捷键无论Pannel隐藏与否都生效,可以设置快捷键的' Qt::ApplicationShortcut
的快捷方式上下文'属性也无效。这种情况下,您可以在创建Category的地方手动创建快捷键
例子:
ribbon build
...
QShortcut* shortCut = new QShortcut(QKeySequence(QLatin1String( " Ctrl+S " )), this );
connect (shortCut, &QShortcut::activated, this , [ actSave ]() {
actSave-> trigger ();
});