Qt的开源库TabToolbar

news2024/9/24 1:27:14

开源地址:https://github.com/SeriousAlexej/TabToolbar

该库的使用方式有两种:

  • 使用json配置文件配置TabToolBar
  • 使用代码构建TabToolBar

编译

项目是使用Qt和CMake管理的,并且在开发的时候使用的是Qt6,我实测通过更改CMake的配置文件,在Qt6中也是可以使用的。这一部分修改省略

  • 最后运行起来的情况
    图1

这里我主要想探索一下,这个开源库的使用

一、探索

(一)、学习他的案例程序

在这里插入图片描述
在文件结构中的位置如上图。

使用方式一:使用json配置文件

    tt::Builder ttb(this);
    ttb.SetCustomWidgetCreator("textEdit", []() { return new QTextEdit(); });
    ttb.SetCustomWidgetCreator("checkBox", []() { return new QCheckBox(); });
    ttb.SetCustomWidgetCreator("pushButton", []() { return new QPushButton(); });
    tt::TabToolbar* tabToolbar = ttb.CreateTabToolbar(":/tt/tabtoolbar.json");
    addToolBar(Qt::TopToolBarArea, tabToolbar);

    ttb["customTextEdit"]->setMaximumWidth(100);

    ((QCheckBox*)ttb["customCheckBox"])->setText("点击");
    QPushButton* btn = (QPushButton*)ttb["customEditButton"];
    btn->setText("Edit");
    static bool kek = true;
    tt::Page* editPage = (tt::Page*)ttb["Edit"];
    QObject::connect(btn, &QPushButton::clicked, [editPage]()
    {
        if(kek)
            editPage->hide();
        else
            editPage->show();
        kek = !kek;
    });

    QObject::connect(tabToolbar, &tt::TabToolbar::SpecialTabClicked, this, [this]()
    {
        QMessageBox::information(this, "Kek", "Cheburek");
    });

    //create buttons for each style
    tt::Group* stylesGroup = (tt::Group*)ttb["Styles"];
    stylesGroup->AddSeparator();
    QStringList styles = tt::GetRegisteredStyles();
    for(int i=0; i<styles.size(); i++)
    {
        const QString styleName = styles.at(i);
        QPushButton* btn = new QPushButton(styleName, this);
        QObject::connect(btn, &QPushButton::clicked, [styleName, tabToolbar]() { tabToolbar->SetStyle(styleName); });
        stylesGroup->AddWidget(btn);
    }

    tt::RegisterStyle("NoStyle", []()
    {
        tt::StyleParams* params = new tt::StyleParams();
        params->UseTemplateSheet = false;
        params->AdditionalStyleSheet = "";
        return params;
    });
    btn = (QPushButton*)ttb["nativeStyleButton"];
    btn->setText("No Style");
    QObject::connect(btn, &QPushButton::clicked, [tabToolbar]() { tabToolbar->SetStyle("NoStyle"); });
    btn = (QPushButton*)ttb["defaultStyleButton"];
    btn->setText("Default");
    QObject::connect(btn, &QPushButton::clicked, [tabToolbar]() { tabToolbar->SetStyle(tt::GetDefaultStyle()); });
{
  "groupHeight": 75,
  "groupRowCount": 3,
  "specialTab": true,
  "cornerActions": [
    "actionHelp"
  ],
  "menus": [
    {
      "name": "dummyMenu",
      "actions": [
        "actionDummy",
        "separator",
        "actionHelp"
      ]
    }
  ],
  "tabs": [
    {
      "displayName": "文件",
      "name": "File",
      "groups": []
    },
    {
      "displayName": "编辑",
      "name": "Edit",
      "groups": [
        {
          "displayName": "样式",
          "name": "Styles",
          "content": [
            {
              "itemType": "subgroup",
              "aligned": true,
              "name": "stylesSubgroup1",
              "content": [
                {
                  "itemType": "pushButton",
                  "name": "nativeStyleButton"
                },
                {
                  "itemType": "pushButton",
                  "name": "defaultStyleButton"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "displayName": "视图",
      "name": "View",
      "groups": [
        {
          "displayName": "分组1",
          "name": "Group 1",
          "content": [
            {
              "itemType": "action",
              "type": "delayedPopup",
              "name": "actionOpen"
            },
            {
              "itemType": "separator"
            },
            {
              "itemType": "action",
              "type": "delayedPopup",
              "name": "actionSave"
            },
            {
              "itemType": "action",
              "type": "delayedPopup",
              "name": "actionSaveAs"
            }
          ]
        },
        {
          "displayName": "分组2",
          "name": "Group 2",
          "content": [
            {
              "itemType": "action",
              "type": "instantPopup",
              "name": "actionPolypaint",
              "menu": "dummyMenu"
            },
            {
              "itemType": "action",
              "type": "instantPopup",
              "name": "actionScale",
              "menu": "dummyMenu"
            },
            {
              "itemType": "separator"
            },
            {
              "itemType": "textEdit",
              "name": "customTextEdit"
            },
            {
              "itemType": "subgroup",
              "name": "group2Subgroup",
              "aligned": true,
              "content": [
                {
                  "itemType": "action",
                  "type": "delayedPopup",
                  "name": "actionUndo"
                },
                {
                  "itemType": "action",
                  "type": "delayedPopup",
                  "name": "actionRedo"
                },
                {
                  "itemType": "action",
                  "type": "instantPopup",
                  "name": "actionClose",
                  "menu": "dummyMenu"
                }
              ]
            }
          ]
        },
        {
          "displayName": "分组3",
          "name": "Group 3",
          "content": [
            {
              "itemType": "action",
              "type": "menuButtonPopup",
              "name": "actionSettings",
              "menu": "dummyMenu"
            },
            {
              "itemType": "subgroup",
              "name": "group3Subgroup1",
              "aligned": true,
              "content": [
                {
                  "itemType": "horizontalActions",
                  "actions": [
                    {
                      "type": "delayedPopup",
                      "name": "actionSave"
                    },
                    {
                      "type": "instantPopup",
                      "name": "actionPolypaint",
                      "menu": "dummyMenu"
                    },
                    {
                      "type": "menuButtonPopup",
                      "name": "actionSettings",
                      "menu": "dummyMenu"
                    }
                  ]
                },
                {
                  "itemType": "horizontalActions",
                  "actions": [
                    {
                      "type": "delayedPopup",
                      "name": "actionUndo"
                    },
                    {
                      "type": "delayedPopup",
                      "name": "actionRedo"
                    },
                    {
                      "type": "instantPopup",
                      "name": "actionClose",
                      "menu": "dummyMenu"
                    }
                  ]
                },
                {
                  "itemType": "checkBox",
                  "name": "customCheckBox"
                }
              ]
            },
            {
              "itemType": "separator"
            },
            {
              "itemType": "subgroup",
              "name": "group3Subgroup2",
              "aligned": false,
              "content": [
                {
                  "itemType": "pushButton",
                  "name": "customEditButton"
                },
                {
                  "itemType": "action",
                  "type": "delayedPopup",
                  "name": "actionSaveAs"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "displayName": "帮助",
      "name": "Help",
      "groups": [
        {
          "displayName": "",
          "name": "HelpGroup",
          "content": [
            {
              "displayName": "帮助",
              "itemType": "action",
              "type": "delayedPopup",
              "name": "actionHelp"
            },
            {
              "itemType": "action",
              "type": "delayedPopup",
              "name": "actionAbout"
            }
          ]
        }
      ]
    }
  ]
}

分析一下

1.创建对象

    tt::Builder ttb(this);
    ttb.SetCustomWidgetCreator("textEdit", []() { return new QTextEdit(); });
    ttb.SetCustomWidgetCreator("checkBox", []() { return new QCheckBox(); });
    ttb.SetCustomWidgetCreator("pushButton", []() { return new QPushButton(); });
  1. 创建Tabtoolbar并添加到tool工具栏
    tt::TabToolbar* tabToolbar = ttb.CreateTabToolbar(":/tt/tabtoolbar.json");
    addToolBar(Qt::TopToolBarArea, tabToolbar);

    ttb["customTextEdit"]->setMaximumWidth(100);

    ((QCheckBox*)ttb["customCheckBox"])->setText("点击");
    QPushButton* btn = (QPushButton*)ttb["customEditButton"];
    btn->setText("Edit");
    static bool kek = true;
    tt::Page* editPage = (tt::Page*)ttb["Edit"];
    QObject::connect(btn, &QPushButton::clicked, [editPage]()
    {
        if(kek)
            editPage->hide();
        else
            editPage->show();
        kek = !kek;
    });

    QObject::connect(tabToolbar, &tt::TabToolbar::SpecialTabClicked, this, [this]()
    {
        QMessageBox::information(this, "Kek", "Cheburek");
    });

    //create buttons for each style
    tt::Group* stylesGroup = (tt::Group*)ttb["Styles"];
    stylesGroup->AddSeparator();
    QStringList styles = tt::GetRegisteredStyles();
    for(int i=0; i<styles.size(); i++)
    {
        const QString styleName = styles.at(i);
        QPushButton* btn = new QPushButton(styleName, this);
        QObject::connect(btn, &QPushButton::clicked, [styleName, tabToolbar]() { tabToolbar->SetStyle(styleName); });
        stylesGroup->AddWidget(btn);
    }

    tt::RegisterStyle("NoStyle", []()
    {
        tt::StyleParams* params = new tt::StyleParams();
        params->UseTemplateSheet = false;
        params->AdditionalStyleSheet = "";
        return params;
    });
    btn = (QPushButton*)ttb["nativeStyleButton"];
    btn->setText("No Style");
    QObject::connect(btn, &QPushButton::clicked, [tabToolbar]() { tabToolbar->SetStyle("NoStyle"); });
    btn = (QPushButton*)ttb["defaultStyleButton"];
    btn->setText("Default");
    QObject::connect(btn, &QPushButton::clicked, [tabToolbar]() { tabToolbar->SetStyle(tt::GetDefaultStyle()); });

再开一下json文件的内容

分别指定组的高度,每组容纳的最多行数,是否启用特殊标签,然后就是角落的action,然后是定义菜单栏的情况,最后是定义tab标签。

{
  "groupHeight": 75,
  "groupRowCount": 3,
  "specialTab": true,
  "cornerActions": [
    ...
  ],
  "menus": [
 	...
  ],
  "tabs": [
 	...
  ]

使用方式二:使用代码控制

首先看一下代码,

	using namespace tt;

    TabToolbar* tt = new TabToolbar(this, 75, 3);
    addToolBar(Qt::TopToolBarArea, tt);

    QMenu* menu = new QMenu(this);
    menu->setObjectName("dummyMenu");
    menu->addActions({ui->actionDummy});

    tt->AddPage("File");
    static bool kek = true;
    Page* editPage = tt->AddPage("Edit");

    Page* viewPage = tt->AddPage("View");
    Group* g1 = viewPage->AddGroup("Group 1");
    Group* g2 = viewPage->AddGroup("Group 2");
    Group* g3 = viewPage->AddGroup("Group 3");
    g1->AddAction(QToolButton::DelayedPopup, ui->actionOpen);
    g1->AddSeparator();
    g1->AddAction(QToolButton::DelayedPopup, ui->actionSave);
    g1->AddAction(QToolButton::DelayedPopup, ui->actionSaveAs);
    g2->AddAction(QToolButton::InstantPopup, ui->actionPolypaint, menu);
    g2->AddAction(QToolButton::InstantPopup, ui->actionScale, menu);
    g2->AddSeparator();
    QTextEdit* te = new QTextEdit();
    g2->AddWidget(te);
    te->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
    te->setMaximumWidth(100);
    SubGroup* g2s = g2->AddSubGroup(SubGroup::Align::Yes);
    g2s->AddAction(QToolButton::DelayedPopup, ui->actionUndo);
    g2s->AddAction(QToolButton::DelayedPopup, ui->actionRedo);
    g2s->AddAction(QToolButton::InstantPopup, ui->actionClose, menu);
    g3->AddAction(QToolButton::MenuButtonPopup, ui->actionSettings, menu);
    SubGroup* g3s = g3->AddSubGroup(SubGroup::Align::Yes);
    g3s->AddHorizontalButtons({{QToolButton::DelayedPopup, ui->actionSave},
                               {QToolButton::InstantPopup, ui->actionPolypaint, menu},
                               {QToolButton::MenuButtonPopup, ui->actionSettings, menu}});

    g3s->AddHorizontalButtons({{QToolButton::DelayedPopup, ui->actionUndo},
                               {QToolButton::DelayedPopup, ui->actionRedo},
                               {QToolButton::InstantPopup, ui->actionClose, menu}});
    QCheckBox* ch = new QCheckBox("Check 1");
    g3s->AddWidget(ch);

    g3->AddSeparator();
    SubGroup* g3ss = g3->AddSubGroup(SubGroup::Align::No);
    QPushButton* btn = new QPushButton("Edit");
    g3ss->AddWidget(btn);
    g3ss->AddAction(QToolButton::DelayedPopup, ui->actionSaveAs);
    QObject::connect(btn, &QPushButton::clicked, [editPage]()
    {
        if(kek)
            editPage->hide();
        else
            editPage->show();
        kek = !kek;
    });

    tt->AddPage("Help");

    tt->SetSpecialTabEnabled(true);
    tt->AddCornerAction(ui->actionHelp);
    QObject::connect(tt, &TabToolbar::SpecialTabClicked, this, [this]()
    {
        QMessageBox::information(this, "Kek", "Cheburek");
    });

然后我们来分析一下,这是怎么使用的

  1. 创建对象
	using namespace tt;  //使用库的名字空间

    TabToolbar* tt = new TabToolbar(this, 75, 3); //初始化
    addToolBar(Qt::TopToolBarArea, tt); //添加TabToolbar到tool工具栏
  1. 设计内容
	//创建案例并绑定ui设计器里面的action
	QMenu* menu = new QMenu(this);
    menu->setObjectName("dummyMenu");
    menu->addActions({ui->actionDummy});
	
	//添加tab页
    tt->AddPage("File");
    static bool kek = true;
    Page* editPage = tt->AddPage("Edit");//添加tab页,并获取对象

    Page* viewPage = tt->AddPage("View");
    Group* g1 = viewPage->AddGroup("Group 1"); //再tab页里面添加组
    Group* g2 = viewPage->AddGroup("Group 2");
    Group* g3 = viewPage->AddGroup("Group 3");
	
	//各组控件的设置
    g1->AddAction(QToolButton::DelayedPopup, ui->actionOpen);
    g1->AddSeparator();
    g1->AddAction(QToolButton::DelayedPopup, ui->actionSave);
    g1->AddAction(QToolButton::DelayedPopup, ui->actionSaveAs);
    g2->AddAction(QToolButton::InstantPopup, ui->actionPolypaint, menu);
    g2->AddAction(QToolButton::InstantPopup, ui->actionScale, menu);
    g2->AddSeparator();
    QTextEdit* te = new QTextEdit();
    g2->AddWidget(te);
    te->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
    te->setMaximumWidth(100);
    SubGroup* g2s = g2->AddSubGroup(SubGroup::Align::Yes);
    g2s->AddAction(QToolButton::DelayedPopup, ui->actionUndo);
    g2s->AddAction(QToolButton::DelayedPopup, ui->actionRedo);
    g2s->AddAction(QToolButton::InstantPopup, ui->actionClose, menu);
    g3->AddAction(QToolButton::MenuButtonPopup, ui->actionSettings, menu);
    SubGroup* g3s = g3->AddSubGroup(SubGroup::Align::Yes);
    g3s->AddHorizontalButtons({{QToolButton::DelayedPopup, ui->actionSave},
                               {QToolButton::InstantPopup, ui->actionPolypaint, menu},
                               {QToolButton::MenuButtonPopup, ui->actionSettings, menu}});

    g3s->AddHorizontalButtons({{QToolButton::DelayedPopup, ui->actionUndo},
                               {QToolButton::DelayedPopup, ui->actionRedo},
                               {QToolButton::InstantPopup, ui->actionClose, menu}});
    QCheckBox* ch = new QCheckBox("Check 1");
    g3s->AddWidget(ch);

    g3->AddSeparator();
    SubGroup* g3ss = g3->AddSubGroup(SubGroup::Align::No);
    QPushButton* btn = new QPushButton("Edit");
    g3ss->AddWidget(btn);
    g3ss->AddAction(QToolButton::DelayedPopup, ui->actionSaveAs);
    QObject::connect(btn, &QPushButton::clicked, [editPage]()
    {
        if(kek)
            editPage->hide();
        else
            editPage->show();
        kek = !kek;
    });

    tt->AddPage("Help");

    tt->SetSpecialTabEnabled(true);
    tt->AddCornerAction(ui->actionHelp); 	//绑定action
    QObject::connect(tt, &TabToolbar::SpecialTabClicked, this, [this]()//绑定action
    {
        QMessageBox::information(this, "Kek", "Cheburek");
    });

总结

  • TabToolbar* tt = new TabToolbar(); // 构造tabtoolbar
  • addToolBar(Qt::TopToolBarArea, tt); // 添加对象到mainwindows
  • Page* editPage = tt->AddPage(“Edit”);//添加tab页,并获取对象
  • Group* g1 = editPage ->AddGroup(“Group 1”); //tab页里面添加组
  • g1->AddAction(QToolButton::DelayedPopup, ui->actionOpen); // 添加action
  • g1->AddSeparator();// 添加分割器
  • 不想写了,估计你也会了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式——代理模式

文章目录引入案例提出问题解决思路遇到的困难代理模式概念生活中的代理相关术语静态代理动态代理织入的概念基于JDK的动态代理基于Cglib的动态代理JDK 和 CGLIB 的区别引入案例 计数器的接口 public interface Calculator {int add(int i, int j);int sub(int i, int j);int …

pandas案例——预处理部分地区数据

数据清洗的任务是过滤那些不符合要求的数据&#xff0c;将过滤的结果交给业务主管部门&#xff0c;确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。数据清洗是与问卷审核不同&#xff0c;录入后的数据…

使用反射和泛型简化Golang查询数据库代码的方案

大纲Postgresql数组案例常规写法定义结构体查询数据问题反射泛型写法结构体定义接口Tag实现逻辑泛型设计实例化模型结构体获取表名过滤字段组装SQL语句查询遍历读取结果实例化模型结构体组装Scan方法的参数调用Scan方法并保存结果完整代码小结Postgresql数组 Postgresql有个很…

7、操作DOM对象(重点)

核心&#xff1a;浏览器网页就是一个DOM树形结构 更新&#xff1a;更新该DOM节点的内容&#xff0c;相当于更新了该DOM节点表示的HTML的内容&#xff1b; 遍历&#xff1a;遍历该DOM节点下的子节点&#xff0c;以便进行进一步操作&#xff1b; 添加&#xff1a;在该DOM节点下…

Matlab中的dsp.AudioFileReader函数的认识和学习

在Matlab中的dsp.AudioFileReader函数的认识和学习1.描述2.语法2.1 语法描述2.2 属性Properties2.3 举例Stream from audio file 来自音频文件的流 1.描述 dsp.AudioFileReader系统对象™ 从音频文件读取音频样本。 要从音频文件读取音频样本&#xff0c;请执行以下操作&…

小方制药冲刺A股上市:毛利率走低,方之光、鲁爱萍夫妇为实控人

近日&#xff0c;上海小方制药股份有限公司&#xff08;下称“小方制药”&#xff09;公开预披露更新招股书&#xff0c;准备在上海证券交易所主板上市。据贝多财经了解&#xff0c;小方制药于2022年7月1日递交招股书&#xff0c;国信证券为其保荐机构。 本次冲刺上市&#xff…

扫码器:壹码通(EMT 6621)二维码带多个回车换行处理

摘要&#xff1a;二维码运用越来越广泛了&#xff0c;目前在医院中一个二维码可以串联多个系统&#xff0c;二维码的内容也可以设置一些特殊字符去达成系统便捷性。本次遇到为二维码中开头内置了回车和空格&#xff0c;在程序判断为回车(KEY_ENTER)时就会触发业务逻辑&#xff…

mybatis之一级缓存和二级缓存

缓存&#xff1a; 查询需要连接数据库&#xff0c;非常的耗费资源&#xff0c;将一次查询的结果&#xff0c;暂存在一个可以直接取到的地方&#xff0c;我们将其称之为缓存&#xff0c;当我们需要再次查询相同的数据时&#xff0c;直接走缓存这个过程&#xff0c;就不用走数据…

【RabbitMQ三】——RabbitMQ工作队列模式(Work Queues)

RabbitMQ工作队列模式为什么要有工作队列模式如何使用工作队列模式轮询消息确认验证消息确认消息持久化公平调度验证公平调度**现在将消费者1中的Thread.sleep(1000)改为Thread.sleep(3000);不添加公平调度相关代码进行测试。**现在将消费者1中的Thread.sleep(1000)改为Thread.…

BC即将登录Coinbase Institutional,2023年以全新姿态出发

以支付为最初定位的加密资产&#xff0c;在支付领域的发展始终停滞不前&#xff0c;尤其是在2022年&#xff0c;加密行业经历了几次“至暗时刻”&#xff0c;导致加密市场资金不断出逃市场全面转熊&#xff0c;越来越多的人对加密资产市场的发展前景失去信心。 而在2021年年底开…

【GD32F427开发板试用】移植CoreMark验证0等待区Flash大小

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Doravmon 引言 非常荣幸能够参与到此次GD32F427开发板试用的活动中来&#xff0c;在拿到开发板之前就翻了翻手册&#xff0c;一直有个疑问困惑…

APM/STM32F072RB基于HAL库配置USB CDC虚拟串口功能

APM/STM32F072RB基于HAL库配置USB CDC虚拟串口功能&#x1f4e2;采用的自制开发板&#xff0c;开源PCB工程详情放在《极海APM32F072RB开发环境测试》✨本案例基于STM32CubeMX工具配置。&#x1f4fa;使用STM32CubeMX工具配置工程改为APMF072RB型号过程如下&#xff1a; ⛳注意…

性能测试实战 | 电商业务的性能测试(一): 必备基础知识

本文为霍格沃兹测试学院优秀学员课程学习系列笔记&#xff0c;想一起系统进阶的同学文末加群交流。 1.1 测试步骤总览 需求分析与测试设计&#xff08;性能需求目标业务模型拆解&#xff09; 测试数据准备和构造(基于模型的数据准备) 性能指标预期(性能需求目标) 发压工具配…

vue2 使用@vue/composition-api依赖包 编译、打包各种报错

vue2 使用vue/composition-api依赖包 编译、打包各种报错问题来源解决办法最近在维护以前&#xff08;大概一年前&#xff09;的项目时&#xff0c;遇到个这种问题&#xff1a; 项目本身是用 vue-cli 创建的 vue 2.x.xx 版本的项目&#xff0c;然后引入 vue/composition-api 依…

MIT6.830-2022-lab5实验思路详细讲解

文章目录前言一、实验背景二、实验正文Exercise 1 &#xff1a;SearchExercise 2 &#xff1a;Insert - Splitting PagesExercise 3 &#xff1a;Delete - Redistributing pagesExercise 4&#xff1a;Delete - Redistributing pages总结前言 Datebase中很重要的一部分就是ind…

【Java面试】SpringBoot篇

注&#xff1a;本文通篇将SpringBoot以sb代替。 文章目录Spring和SpringBoot的关系和区别&#xff1f;谈谈你对SpringBoot的理解&#xff0c;它有哪些特性&#xff1f;SpringBoot的核心注解说说你对SpringBoot自动配置的理解为什么SpringBoot的jar包可以直接运行&#xff1f;Sp…

uboot启动流程分析(基于i.m6ull)

一、uboot的makefile 1.1 makefile整体解析过程 为了生成u-boot.bin这个文件&#xff0c;首先要生成构成u-boot.bin的各个库文件、目标文件。为了各个库文件、目标文件就必须进入各个子目录执行其中的Makefile。由此&#xff0c;确定了整个编译的命令和顺序。 1.2 makefile整…

10.2 初始泛型算法

文章目录只读算法find()count()accumulate()equal()写容器元素算法fill()fill_n()back_inserter()copy()copy_backward()replace()replace_copy()next_permutation()prev_permutation()重排容器元素算法sort()unique()stable_sort()除了少数例外&#xff0c;标准库算法都对一个…

pandas数据聚合与分组运算

文章目录数据聚合与分组运算分组与聚合的原理通过groupby()方法将数据拆分成组按列名进行分组按Series对象进行分组按字典进行分组按函数进行分组数据聚合与分组运算 对数据集进行分组并对各组应用一个函数&#xff08;无论是聚合还是转换&#xff09;&#xff0c;通常是数据分…

哈佛结构和冯诺依曼结构?STM32属于哈佛结构还是冯诺依曼结构?

现代的CPU基本上归为冯诺伊曼结构&#xff08;也成普林斯顿结构&#xff09;和哈佛结构。 冯诺依曼体系 冯诺依曼体系结构图如下 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数据与指令都存储在同一存储区中&…