开源Qt Ribbon控件——SARibbon的布局思路及介绍

这篇具有很好参考价值的文章主要介绍了开源Qt Ribbon控件——SARibbon的布局思路及介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


原文链接: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 下结合SARibbon、Dock 开发Opencascade应用的基础框架

SARibbon的布局

在介绍如何使用SARibbon之前,需要首先了解SARibbon是如何布局的,在src/SARibbonBar/doc下有个ppt对Ribbon的布局进行了介绍,本文内容与ppt一直,增加了一些文字说明。

由于SARibbon支持四种布局模式,这四种布局模式定义在SARibbonBar的枚举SARibbonBar::RibbonStyle,由于布局模式会影响显示效果和实际函数调用的方法,因此有必要先对SARibbon支持的这四种布局模式进行介绍。

SARibbon名词定义

无论是后面介绍的wps模式还是office模式,这些专有名称都是一致的,这些命名参考了MFC的ribbon界面类。
基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon

  • Category 类别,代表一个标签所呈现的内容,对应SARibbonCategory
  • Context Category 上下文类别,这个是一种特殊的类别,它正常不显示,需要基于上下文判断是否应该显示,最常用的就是word中插入图片后,会有图片修改相关的标签出现,如果没选中图片,这个标签就消失,这个就是上下文类别,对应SARibbonContextCategory
  • Pannel 面板,这个是一组菜单的集合,office里面板都会有个面板标题,显示在面板最下方,面板之后就是工具栏按钮(Action)
  • Application Button 应用按钮,标签栏最左边的按钮(word就是对应文件按钮),这个按钮会触发一些特殊的页面或菜单,对应SARibbonApplicationButton,可以隐藏
  • Quick Access Bar 快速响应栏,位于最顶部的一个简单工具栏,用于放置一些常用的action,对应SARibbonQuickAccessBar
  • Gallery 预览控件,这是Ribbon最吸引眼球的控件,用直观的图像把功能显示出来,甚至有些会根据上下文进行实时渲染,典型的就是word开始标签下的样式选择,对应SARibbonGallery

Office布局模式——SARibbonBar::OfficeStyle

此模式和Office的Ribbon样式一致,office的word界面截图如下
基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon
SARibbon OfficeStyle的布局如下图所示:
基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon

这个布局和office的默认布局是一致的

WPS布局模式——SARibbonBar::WpsLiteStyle

此模式和Office的Ribbon样式有区别,参考了WPS的ribbon界面做法,把office ribbon较占空间的标题栏进行利用,实现了界面的最大利用,这个模式下可以减少一个标题栏的高度,WPS模式截图如下:

这个图时WPS对ribbon的第一次更改,wps对ribbon的第二次改动,在行数这一节会有介绍

基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon
wps模式布局:
基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon

pannel的布局

在标准的pannel中,一个action(按钮)有3种布局,以office word为例,pannel的三种布局其实是所占行数:

第一种,占满整个pannel,只有一行,称之为large
第二种,一个pannel下放置两行,称之为medium
第三种,一个pannel放置3行内容,称之为samll

基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon
因此,pannel的布局其实归根结底就是行数,SARibbon一开始是用QGridLayout来对pannel进行布局的,把grid分割为6行,large模式下占全部6行,medium模式下占据3行,small模式下占据2行,后续参考QToolBar的源码,重新实现了pannel的自定义布局。

行数

上一节讲到了pannel的布局,pannel布局一个很关键的点就是行的概念,行的不同定义,会影响整个显示效果。
在高版本的wps中,为了进一步缩减ribbon bar的高度,把ribbon的3行按钮改为了2个,这样使得ribbon bar进一步缩减,对应action不多的category显得会更饱满,相当于只有medium,没有small模式。这是WPS对ribbon的第二次布局更改,新版WPS的截图如下:

基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon
通过这个改动,机智挖掘了ribbon的高度,SARibbon支持这几种ribbon样式,引入了行数的概念,在SARibbonBar::RibbonStyle的枚举中带TwoRow结尾的都是指代2行模式。

/**
* @brief 定义ribbon的风格,第一字节代表样式,第二字节代表是否是2行
*/
enum RibbonStyle {
    OfficeStyle		= 0x0000        ///< 类似office 的ribbon风格
    , WpsLiteStyle		= 0x0001        ///< 类似wps的紧凑风格
    , OfficeStyleTwoRow	= 0x0100        ///< 类似office 的ribbon风格 2行工具栏 三行布局模式,office就是三行布局模式,pannel能布置3行小toolbutton,默认模式
    , WpsLiteStyleTwoRow	= 0x0101        ///< 类似wps的紧凑风格  2行工具栏
};

枚举SARibbonPannelItem::RowProportion是为了表征每个窗体在pannel所占行数的情况,在pannel布局中会常用到,这个枚举定义如下:

/**
    * @brief 定义了行的占比,ribbon中有large,media和small三种占比
    */
enum RowProportion {
    None            ///< 为定义占比,这时候将会依据expandingDirections来判断,如果能有Qt::Vertical,就等同于Large,否则就是Small
    , Large         ///< 大占比,一个widget的高度会充满整个pannel
    , Medium        ///< 中占比,在@ref SARibbonPannel::pannelLayoutMode 为 @ref SARibbonPannel::ThreeRowMode 时才会起作用,且要同一列里两个都是Medium时,会在三行中占据两行
    , Small         ///< 小占比,占SARibbonPannel的一行,Medium在不满足条件时也会变为Small,但不会变为Large
};

SARibbonPannel里管理的每个action都会带有一个占位的属性(SARibbonPannelItem::RowProportion),这个占位属性决定了这个action在pannel里的布局。

下面针对不同行数进行详细介绍。

3行模式

三行模式是传统的pannel布局方式,如下图所示:

基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon
3行模式下有三种占位(SARibbonPannelItem::RowProportion),分别为large、medium和small

  • large大占比,一个widget的高度会充满整个pannel
  • medium中占比,pannel里一列放置2个窗体,前提是这一列2个都是medium,否则会显示异常(暂时还未做medium条件降级到small的处理,后续会实现)
  • small小占比,pannel里一列放置3个窗体
    3行模式下的pannel会显示pannel的标题在Pannel Title区域,另外还有一个OptionAction的区域,这个是给这个action添加特殊触发使用的,如果没有设置OptionAction,这个区域是隐藏。

三行模式最经典的布局就是word:

基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon

2行模式

两行模式是传统的WPS的改进布局法(具体是否是WPS首先这样做的不清楚,我是按照WPS的布局进行参考的),如下图所示:
基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon
2行模式下medium和small占位(SARibbonPannelItem::RowProportion)是一样的,不做区分。

另外两行模式下pannel是不显示标题的。

2行模式是按照WPS的2020进行参考编写的,WPS2020的截图如下:

基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,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);

    //创建SARibbonCategory实例
    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);

    //创建SARibbonPannel实例
    SARibbonPannel *pannel = categoryMain->addPannel("pannel1");
//    QAction *action1 = new QAction("动作1");
    QAction *action1 = new QAction(QIcon(":/prefix1/bing.ico"), tr("动作1"));
    pannel->addLargeAction(action1);
    QAction *action2 = new QAction(QIcon(":/prefix1/kinventorymgr.ico"), tr("动作2"));
    pannel->addLargeAction(action2);
    //创建SARibbonPannel实例
    SARibbonPannel *pannel2 = categoryMain2->addPannel("pannel2");
    QAction *action2_1 = new QAction(QIcon(":/prefix1/qq.ico"), tr("动作2_1"));
    pannel2->addLargeAction(action2_1);
    QAction *action2_2 = new QAction(QIcon(":/prefix1/wpsbox_sharefolder.ico"), tr("动作2_2"));
    pannel2->addLargeAction(action2_2);
    //创建SARibbonPannel实例
    SARibbonPannel *pannel1_2 = categoryMain->addPannel("pannel1_2");
    QAction *action1_2 = new QAction(QIcon(":/prefix1/sync.ico"), tr("动作1_2"));
    pannel1_2->addLargeAction(action1_2);
    QAction *action1_3 = new QAction(QIcon(":/prefix1/print_property.ico"), tr("动作1_3"));
    pannel1_2->addLargeAction(action1_3);

    connect(action1, &QAction::triggered, this, [=]{
        QMessageBox::information(this,"action1消息提示", "这是一条消息提示内容");
//        categoryMain2->setVisible(true);
        ribbon->showCategory(categoryMain2);
//        pannel2->setVisible(true);
        action2_1->setVisible(true);

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

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

特别注意

使用UI方式生成MainWindow,切记:删除MainWindow.ui的工具栏。
使用代码方式生成MainWindow,不要加载菜单栏实例。

基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon
基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon

基于qt的ribbon开源框架,Qt经验总结,工控软件,开源,qt,ribbon文章来源地址https://www.toymoban.com/news/detail-824578.html

到了这里,关于开源Qt Ribbon控件——SARibbon的布局思路及介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt鼠标拖动控件交换布局位置

    方法很简单,交换鼠标起点控件指针和鼠标落点控件指针的值,然后重新布局 Qt鼠标拖动控件交换布局位置 源文件 头文件 下面是只交换控件显示的内容: 添加鼠标贴图,跟随鼠标移动: 一种实现:重写void paintEvent(QPaintEvent *event);方法 另一种实现:

    2024年02月11日
    浏览(29)
  • Qt使用代码放置控件并布局

            上一章中我们从头一步一步地新建项目并运行了窗口,本章就正式踏入Qt界面编程之路。在本章节,我们先用代码编写界面,进行简单的控件放置,然后用代码进行布局;之后使用Qt Designer进行控件放置和界面布局,这使得复杂界面的设计变得简单起来。      

    2024年02月07日
    浏览(34)
  • QT基础入门【布局篇】消除控件之间的间隔

    layoutLeftMargin: layout内的布局距离边框左端的距离。 layoutTopMargin: layout内的布局距离边框顶端的距离。 layoutRightMargin: layout内的布局距离边框右端的距离。 layoutBottomMargin: layout内的布局距离边框底端的距离。 layoutHorizontalSpacing: layout内的水平方向内的对象(包括控件和低一级布局

    2024年01月19日
    浏览(31)
  • C++ Qt 学习(二):常用控件使用与界面布局

    ui 设计器设计界面很方便,为什么还要手写代码? 更好的控制布局 更好的设置 qss 代码复用 完全不会写 Qt 布局,很麻烦,怎么学会手写布局? 看 Qt 自己怎么写 改良 Qt 的布局写法 1.1 水平布局 addWidget() 在布局里添加一个控件 addLayout() 在布局里添加子布局 setMargin() 设置水平

    2024年02月06日
    浏览(42)
  • Qt之格栅布局(QGridLayout)控件填满整个单元格

    Qt专栏: 目录 1.现象1 2.解决方案 3.现象2 4.解决方案 5.总结         今天在用QGridLayout布局的时候,添加到布局的QWidget有文本框、标签、组合框和按钮等等,布局两列,通过下面的方式添加进去的: 发现在窗口拉伸的时候,pEdit 不会填满第0行1列的位置,右边有空隙。    

    2024年04月15日
    浏览(61)
  • QT自定义优雅的表单控件,简单实现设置界面布局

    FormView.h FormView.cpp 核心函数 函数 变量 功能 addEditableItem title: 输入框前面的提示文字,同时作为该控件的标识符 place_holder: 输入框中的提示文字 在表单中插入一个可填写项 addCheckableItem title: 不显示在UI中,仅作为该控件的标识符 content: 勾选框后面的内容 init_status: 勾选框的初

    2024年02月11日
    浏览(33)
  • 【QT】一 设置布局后,控件大小会自动变化,如何设置想要的

    目录 1. 设置好控件大小 2. 设置布局  3. 设置layout  给一个QWidget控件内部设置布局后,原来内部的控件大小变小了,如何解决?           把最小值设置好。         选择整体,选择布局方式,这里为水平布局。 你会发现,可能显示不全。 选择整体,属性拉到最下面,

    2024年02月11日
    浏览(58)
  • 解决QT中UI控件布局更改后运行结果没有发生变化的问题

    在学习QT中,遇到了一个问题,那就是当我UI中更改了控件布局后,运行的结果却并没有发生改变,于是我上网查找了一些资料,大多略显麻烦。 效果如下:这是UI控件更改布局后  这是运行后结果 显然,UI文件中并没有更新。 我的解决方案是: 1.首先在项目文件中找到UI文件

    2024年02月11日
    浏览(71)
  • VS+Qt设置窗口尺寸(二):窗体控件自适应窗口布局,自动调整大小

    VS版本:VS2019 QT版本:Qt5.12.3(msvc2017_64) 为了适配不同尺寸的显示屏,软件窗口需要调整大小,窗口内的控件尺寸也要适配窗口的大小。 本例重点讲述如何设置可调整尺寸的窗口及控件,实现窗口最大化和尺寸调节。 本例使用相对简单的按键和文本框来做示例,其他控件均可

    2023年04月23日
    浏览(67)
  • QT的布局与间隔器介绍

    1、概述 QT中使用绝对定位的布局方式,无法适用窗口的变化,但是,也可以通过尺寸策略来进行 调整,使得 可以适用窗口变化。 布局管理器作用最主要用来在qt设计师中进行控件的排列,另外,布局管理器还可以通过 纯代码的方式来设计界面 qt中提供对界面进行布局,主要

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包