国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

開源Qt Ribbon控件——SARibbon的布局思路及介紹

這篇具有很好參考價(jià)值的文章主要介紹了開源Qt Ribbon控件——SARibbon的布局思路及介紹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


原文鏈接:https://blog.csdn.net/czyt1988/article/details/113811620

https://devpress.csdn.net/gitcode/6412b1fe986c660f3cf9294a.html?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTactivity-4-108312948-blog-126431338.235^v31^pc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTactivity-4-108312948-blog-126431338.235v31pc_relevant_default_base3&utm_relevant_index=7#devmenu2

Qt 下結(jié)合SARibbon、Dock 開發(fā)Opencascade應(yīng)用的基礎(chǔ)框架

SARibbon的布局

在介紹如何使用SARibbon之前,需要首先了解SARibbon是如何布局的,在src/SARibbonBar/doc下有個(gè)ppt對(duì)Ribbon的布局進(jìn)行了介紹,本文內(nèi)容與ppt一直,增加了一些文字說明。

由于SARibbon支持四種布局模式,這四種布局模式定義在SARibbonBar的枚舉SARibbonBar::RibbonStyle,由于布局模式會(huì)影響顯示效果和實(shí)際函數(shù)調(diào)用的方法,因此有必要先對(duì)SARibbon支持的這四種布局模式進(jìn)行介紹。

SARibbon名詞定義

無論是后面介紹的wps模式還是office模式,這些專有名稱都是一致的,這些命名參考了MFC的ribbon界面類。
基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon

  • Category 類別,代表一個(gè)標(biāo)簽所呈現(xiàn)的內(nèi)容,對(duì)應(yīng)SARibbonCategory
  • Context Category 上下文類別,這個(gè)是一種特殊的類別,它正常不顯示,需要基于上下文判斷是否應(yīng)該顯示,最常用的就是word中插入圖片后,會(huì)有圖片修改相關(guān)的標(biāo)簽出現(xiàn),如果沒選中圖片,這個(gè)標(biāo)簽就消失,這個(gè)就是上下文類別,對(duì)應(yīng)SARibbonContextCategory
  • Pannel 面板,這個(gè)是一組菜單的集合,office里面板都會(huì)有個(gè)面板標(biāo)題,顯示在面板最下方,面板之后就是工具欄按鈕(Action)
  • Application Button 應(yīng)用按鈕,標(biāo)簽欄最左邊的按鈕(word就是對(duì)應(yīng)文件按鈕),這個(gè)按鈕會(huì)觸發(fā)一些特殊的頁面或菜單,對(duì)應(yīng)SARibbonApplicationButton,可以隱藏
  • Quick Access Bar 快速響應(yīng)欄,位于最頂部的一個(gè)簡單工具欄,用于放置一些常用的action,對(duì)應(yīng)SARibbonQuickAccessBar
  • Gallery 預(yù)覽控件,這是Ribbon最吸引眼球的控件,用直觀的圖像把功能顯示出來,甚至有些會(huì)根據(jù)上下文進(jìn)行實(shí)時(shí)渲染,典型的就是word開始標(biāo)簽下的樣式選擇,對(duì)應(yīng)SARibbonGallery

Office布局模式——SARibbonBar::OfficeStyle

此模式和Office的Ribbon樣式一致,office的word界面截圖如下
基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon
SARibbon OfficeStyle的布局如下圖所示:
基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon

這個(gè)布局和office的默認(rèn)布局是一致的

WPS布局模式——SARibbonBar::WpsLiteStyle

此模式和Office的Ribbon樣式有區(qū)別,參考了WPS的ribbon界面做法,把office ribbon較占空間的標(biāo)題欄進(jìn)行利用,實(shí)現(xiàn)了界面的最大利用,這個(gè)模式下可以減少一個(gè)標(biāo)題欄的高度,WPS模式截圖如下:

這個(gè)圖時(shí)WPS對(duì)ribbon的第一次更改,wps對(duì)ribbon的第二次改動(dòng),在行數(shù)這一節(jié)會(huì)有介紹

基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon
wps模式布局:
基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon

pannel的布局

在標(biāo)準(zhǔn)的pannel中,一個(gè)action(按鈕)有3種布局,以office word為例,pannel的三種布局其實(shí)是所占行數(shù):

第一種,占滿整個(gè)pannel,只有一行,稱之為large
第二種,一個(gè)pannel下放置兩行,稱之為medium
第三種,一個(gè)pannel放置3行內(nèi)容,稱之為samll

基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon
因此,pannel的布局其實(shí)歸根結(jié)底就是行數(shù),SARibbon一開始是用QGridLayout來對(duì)pannel進(jìn)行布局的,把grid分割為6行,large模式下占全部6行,medium模式下占據(jù)3行,small模式下占據(jù)2行,后續(xù)參考QToolBar的源碼,重新實(shí)現(xiàn)了pannel的自定義布局。

行數(shù)

上一節(jié)講到了pannel的布局,pannel布局一個(gè)很關(guān)鍵的點(diǎn)就是行的概念,行的不同定義,會(huì)影響整個(gè)顯示效果。
在高版本的wps中,為了進(jìn)一步縮減ribbon bar的高度,把ribbon的3行按鈕改為了2個(gè),這樣使得ribbon bar進(jìn)一步縮減,對(duì)應(yīng)action不多的category顯得會(huì)更飽滿,相當(dāng)于只有medium,沒有small模式。這是WPS對(duì)ribbon的第二次布局更改,新版WPS的截圖如下:

基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon
通過這個(gè)改動(dòng),機(jī)智挖掘了ribbon的高度,SARibbon支持這幾種ribbon樣式,引入了行數(shù)的概念,在SARibbonBar::RibbonStyle的枚舉中帶TwoRow結(jié)尾的都是指代2行模式。

/**
* @brief 定義ribbon的風(fēng)格,第一字節(jié)代表樣式,第二字節(jié)代表是否是2行
*/
enum RibbonStyle {
    OfficeStyle		= 0x0000        ///< 類似office 的ribbon風(fēng)格
    , WpsLiteStyle		= 0x0001        ///< 類似wps的緊湊風(fēng)格
    , OfficeStyleTwoRow	= 0x0100        ///< 類似office 的ribbon風(fēng)格 2行工具欄 三行布局模式,office就是三行布局模式,pannel能布置3行小toolbutton,默認(rèn)模式
    , WpsLiteStyleTwoRow	= 0x0101        ///< 類似wps的緊湊風(fēng)格  2行工具欄
};

枚舉SARibbonPannelItem::RowProportion是為了表征每個(gè)窗體在pannel所占行數(shù)的情況,在pannel布局中會(huì)常用到,這個(gè)枚舉定義如下:

/**
    * @brief 定義了行的占比,ribbon中有l(wèi)arge,media和small三種占比
    */
enum RowProportion {
    None            ///< 為定義占比,這時(shí)候?qū)?huì)依據(jù)expandingDirections來判斷,如果能有Qt::Vertical,就等同于Large,否則就是Small
    , Large         ///< 大占比,一個(gè)widget的高度會(huì)充滿整個(gè)pannel
    , Medium        ///< 中占比,在@ref SARibbonPannel::pannelLayoutMode 為 @ref SARibbonPannel::ThreeRowMode 時(shí)才會(huì)起作用,且要同一列里兩個(gè)都是Medium時(shí),會(huì)在三行中占據(jù)兩行
    , Small         ///< 小占比,占SARibbonPannel的一行,Medium在不滿足條件時(shí)也會(huì)變?yōu)镾mall,但不會(huì)變?yōu)長arge
};

SARibbonPannel里管理的每個(gè)action都會(huì)帶有一個(gè)占位的屬性(SARibbonPannelItem::RowProportion),這個(gè)占位屬性決定了這個(gè)action在pannel里的布局。

下面針對(duì)不同行數(shù)進(jìn)行詳細(xì)介紹。

3行模式

三行模式是傳統(tǒng)的pannel布局方式,如下圖所示:

基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon
3行模式下有三種占位(SARibbonPannelItem::RowProportion),分別為large、medium和small

  • large大占比,一個(gè)widget的高度會(huì)充滿整個(gè)pannel
  • medium中占比,pannel里一列放置2個(gè)窗體,前提是這一列2個(gè)都是medium,否則會(huì)顯示異常(暫時(shí)還未做medium條件降級(jí)到small的處理,后續(xù)會(huì)實(shí)現(xiàn))
  • small小占比,pannel里一列放置3個(gè)窗體
    3行模式下的pannel會(huì)顯示pannel的標(biāo)題在Pannel Title區(qū)域,另外還有一個(gè)OptionAction的區(qū)域,這個(gè)是給這個(gè)action添加特殊觸發(fā)使用的,如果沒有設(shè)置OptionAction,這個(gè)區(qū)域是隱藏。

三行模式最經(jīng)典的布局就是word:

基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon

2行模式

兩行模式是傳統(tǒng)的WPS的改進(jìn)布局法(具體是否是WPS首先這樣做的不清楚,我是按照WPS的布局進(jìn)行參考的),如下圖所示:
基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon
2行模式下medium和small占位(SARibbonPannelItem::RowProportion)是一樣的,不做區(qū)分。

另外兩行模式下pannel是不顯示標(biāo)題的。

2行模式是按照WPS的2020進(jìn)行參考編寫的,WPS2020的截圖如下:

基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon

測試案例

在*.pro文件中添加自己的庫路徑
INCLUDEPATH += $$PWD/lib/SARibbonBar_include/.

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAction>
#include <QMessageBox>
#include "SARibbonMainWindow.h"
#include "SARibbonBar.h"
#include "SARibbonCategory.h"
#include "SARibbonCategoryLayout.h"
#include "SARibbonPannel.h"
#include "SARibbonToolButton.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public SARibbonMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : SARibbonMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    SARibbonBar *ribbon = ribbonBar();
    ribbon->setRibbonStyle(SARibbonBar::RibbonStyle::OfficeStyle);
    ribbon->setFont(QFont("微軟雅黑", 12));
    ribbon->applicationButton()->setVisible(true);

    //創(chuàng)建SARibbonCategory實(shí)例
    SARibbonCategory *categoryMain = new SARibbonCategory();
    categoryMain->setCategoryName("Category1");
    categoryMain->setObjectName("categoryMain");
    categoryMain->setFont(QFont("微軟雅黑", 12));
    ribbon->addCategoryPage(categoryMain);

    SARibbonCategory *categoryMain2 = new SARibbonCategory();
    categoryMain2->setCategoryName("Category2");
    categoryMain2->setObjectName("categoryMain2");
    categoryMain2->setFont(QFont("微軟雅黑", 12));
    ribbon->addCategoryPage(categoryMain2);

    //創(chuàng)建SARibbonPannel實(shí)例
    SARibbonPannel *pannel = categoryMain->addPannel("pannel1");
//    QAction *action1 = new QAction("動(dòng)作1");
    QAction *action1 = new QAction(QIcon(":/prefix1/bing.ico"), tr("動(dòng)作1"));
    pannel->addLargeAction(action1);
    QAction *action2 = new QAction(QIcon(":/prefix1/kinventorymgr.ico"), tr("動(dòng)作2"));
    pannel->addLargeAction(action2);
    //創(chuàng)建SARibbonPannel實(shí)例
    SARibbonPannel *pannel2 = categoryMain2->addPannel("pannel2");
    QAction *action2_1 = new QAction(QIcon(":/prefix1/qq.ico"), tr("動(dòng)作2_1"));
    pannel2->addLargeAction(action2_1);
    QAction *action2_2 = new QAction(QIcon(":/prefix1/wpsbox_sharefolder.ico"), tr("動(dòng)作2_2"));
    pannel2->addLargeAction(action2_2);
    //創(chuàng)建SARibbonPannel實(shí)例
    SARibbonPannel *pannel1_2 = categoryMain->addPannel("pannel1_2");
    QAction *action1_2 = new QAction(QIcon(":/prefix1/sync.ico"), tr("動(dòng)作1_2"));
    pannel1_2->addLargeAction(action1_2);
    QAction *action1_3 = new QAction(QIcon(":/prefix1/print_property.ico"), tr("動(dòng)作1_3"));
    pannel1_2->addLargeAction(action1_3);

    connect(action1, &QAction::triggered, this, [=]{
        QMessageBox::information(this,"action1消息提示", "這是一條消息提示內(nèi)容");
//        categoryMain2->setVisible(true);
        ribbon->showCategory(categoryMain2);
//        pannel2->setVisible(true);
        action2_1->setVisible(true);

    });
    connect(action2_2, &QAction::triggered, this, [=]{QMessageBox::information(this,"action2_2消息提示", "這是一條消息提示內(nèi)容");});
    connect(action2, &QAction::triggered, this, [=]{
//        pannel2->setVisible(false);
        action2_1->setVisible(false);
     ribbon->hideCategory(categoryMain2);
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

特別注意

使用UI方式生成MainWindow,切記:刪除MainWindow.ui的工具欄。
使用代碼方式生成MainWindow,不要加載菜單欄實(shí)例。

基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon
基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon

基于qt的ribbon開源框架,Qt經(jīng)驗(yàn)總結(jié),工控軟件,開源,qt,ribbon文章來源地址http://www.zghlxwxcb.cn/news/detail-824578.html

到了這里,關(guān)于開源Qt Ribbon控件——SARibbon的布局思路及介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Qt鼠標(biāo)拖動(dòng)控件交換布局位置

    方法很簡單,交換鼠標(biāo)起點(diǎn)控件指針和鼠標(biāo)落點(diǎn)控件指針的值,然后重新布局 Qt鼠標(biāo)拖動(dòng)控件交換布局位置 源文件 頭文件 下面是只交換控件顯示的內(nèi)容: 添加鼠標(biāo)貼圖,跟隨鼠標(biāo)移動(dòng): 一種實(shí)現(xiàn):重寫void paintEvent(QPaintEvent *event);方法 另一種實(shí)現(xiàn):

    2024年02月11日
    瀏覽(25)
  • Qt使用代碼放置控件并布局

    Qt使用代碼放置控件并布局

    ????????上一章中我們從頭一步一步地新建項(xiàng)目并運(yùn)行了窗口,本章就正式踏入Qt界面編程之路。在本章節(jié),我們先用代碼編寫界面,進(jìn)行簡單的控件放置,然后用代碼進(jìn)行布局;之后使用Qt?Designer進(jìn)行控件放置和界面布局,這使得復(fù)雜界面的設(shè)計(jì)變得簡單起來。 ? ? ?

    2024年02月07日
    瀏覽(24)
  • QT基礎(chǔ)入門【布局篇】消除控件之間的間隔

    QT基礎(chǔ)入門【布局篇】消除控件之間的間隔

    layoutLeftMargin: layout內(nèi)的布局距離邊框左端的距離。 layoutTopMargin: layout內(nèi)的布局距離邊框頂端的距離。 layoutRightMargin: layout內(nèi)的布局距離邊框右端的距離。 layoutBottomMargin: layout內(nèi)的布局距離邊框底端的距離。 layoutHorizontalSpacing: layout內(nèi)的水平方向內(nèi)的對(duì)象(包括控件和低一級(jí)布局

    2024年01月19日
    瀏覽(20)
  • C++ Qt 學(xué)習(xí)(二):常用控件使用與界面布局

    C++ Qt 學(xué)習(xí)(二):常用控件使用與界面布局

    ui 設(shè)計(jì)器設(shè)計(jì)界面很方便,為什么還要手寫代碼? 更好的控制布局 更好的設(shè)置 qss 代碼復(fù)用 完全不會(huì)寫 Qt 布局,很麻煩,怎么學(xué)會(huì)手寫布局? 看 Qt 自己怎么寫 改良 Qt 的布局寫法 1.1 水平布局 addWidget() 在布局里添加一個(gè)控件 addLayout() 在布局里添加子布局 setMargin() 設(shè)置水平

    2024年02月06日
    瀏覽(50)
  • Qt之格柵布局(QGridLayout)控件填滿整個(gè)單元格

    Qt之格柵布局(QGridLayout)控件填滿整個(gè)單元格

    Qt專欄: 目錄 1.現(xiàn)象1 2.解決方案 3.現(xiàn)象2 4.解決方案 5.總結(jié) ? ? ? ? 今天在用QGridLayout布局的時(shí)候,添加到布局的QWidget有文本框、標(biāo)簽、組合框和按鈕等等,布局兩列,通過下面的方式添加進(jìn)去的: 發(fā)現(xiàn)在窗口拉伸的時(shí)候,pEdit 不會(huì)填滿第0行1列的位置,右邊有空隙。 ???

    2024年04月15日
    瀏覽(65)
  • QT自定義優(yōu)雅的表單控件,簡單實(shí)現(xiàn)設(shè)置界面布局

    QT自定義優(yōu)雅的表單控件,簡單實(shí)現(xiàn)設(shè)置界面布局

    FormView.h FormView.cpp 核心函數(shù) 函數(shù) 變量 功能 addEditableItem title: 輸入框前面的提示文字,同時(shí)作為該控件的標(biāo)識(shí)符 place_holder: 輸入框中的提示文字 在表單中插入一個(gè)可填寫項(xiàng) addCheckableItem title: 不顯示在UI中,僅作為該控件的標(biāo)識(shí)符 content: 勾選框后面的內(nèi)容 init_status: 勾選框的初

    2024年02月11日
    瀏覽(29)
  • 【QT】一 設(shè)置布局后,控件大小會(huì)自動(dòng)變化,如何設(shè)置想要的

    【QT】一 設(shè)置布局后,控件大小會(huì)自動(dòng)變化,如何設(shè)置想要的

    目錄 1. 設(shè)置好控件大小 2. 設(shè)置布局? 3. 設(shè)置layout? 給一個(gè)QWidget控件內(nèi)部設(shè)置布局后,原來內(nèi)部的控件大小變小了,如何解決? ????????? 把最小值設(shè)置好。 ? ? ? ? 選擇整體,選擇布局方式,這里為水平布局。 你會(huì)發(fā)現(xiàn),可能顯示不全。 選擇整體,屬性拉到最下面,

    2024年02月11日
    瀏覽(168)
  • VS+Qt設(shè)置窗口尺寸(二):窗體控件自適應(yīng)窗口布局,自動(dòng)調(diào)整大小

    VS+Qt設(shè)置窗口尺寸(二):窗體控件自適應(yīng)窗口布局,自動(dòng)調(diào)整大小

    VS版本:VS2019 QT版本:Qt5.12.3(msvc2017_64) 為了適配不同尺寸的顯示屏,軟件窗口需要調(diào)整大小,窗口內(nèi)的控件尺寸也要適配窗口的大小。 本例重點(diǎn)講述如何設(shè)置可調(diào)整尺寸的窗口及控件,實(shí)現(xiàn)窗口最大化和尺寸調(diào)節(jié)。 本例使用相對(duì)簡單的按鍵和文本框來做示例,其他控件均可

    2023年04月23日
    瀏覽(127)
  • 解決QT中UI控件布局更改后運(yùn)行結(jié)果沒有發(fā)生變化的問題

    解決QT中UI控件布局更改后運(yùn)行結(jié)果沒有發(fā)生變化的問題

    在學(xué)習(xí)QT中,遇到了一個(gè)問題,那就是當(dāng)我UI中更改了控件布局后,運(yùn)行的結(jié)果卻并沒有發(fā)生改變,于是我上網(wǎng)查找了一些資料,大多略顯麻煩。 效果如下:這是UI控件更改布局后 ?這是運(yùn)行后結(jié)果 顯然,UI文件中并沒有更新。 我的解決方案是: 1.首先在項(xiàng)目文件中找到UI文件

    2024年02月11日
    瀏覽(23)
  • QT的布局與間隔器介紹

    QT的布局與間隔器介紹

    1、概述 QT中使用絕對(duì)定位的布局方式,無法適用窗口的變化,但是,也可以通過尺寸策略來進(jìn)行 調(diào)整,使得 可以適用窗口變化。 布局管理器作用最主要用來在qt設(shè)計(jì)師中進(jìn)行控件的排列,另外,布局管理器還可以通過 純代碼的方式來設(shè)計(jì)界面 qt中提供對(duì)界面進(jìn)行布局,主要

    2024年02月12日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包