中文文件點這裡,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,透過SARibbon
可以快速定義你想要的主題風格。
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 Ribbon接口類
一些常見名詞解釋如下
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 ();
});