项目视图组(基于模型)Model-Based-Qt-思维导图-学习笔记

news2024/11/22 5:37:09

项目视图组(基于模型)Model-Based

在这里插入图片描述

Model-Based

(1)List View:清单视图

QListView

  • 继承关系:继承自 QAbstractItemView,被 QListWidget 和 QUndoView 继承

  • 功能:提供模型上的列表或图标视图,以非分层列表或图标集合形式显示模型中的项

  • 历史替代:替代了以前由 QListBox 和 QIconView 提供的列表和图标视图

  • 区别:QListView 基于模型(Model),减少冗余数据,提高效率;QListWidget 是基于项(Item)的,封装了 QListView 的模型,操作更方便

    • 常用的Qt数据模型

      • QStringListModel:用于存储简单的 QString 列表

      • QStandardItemModel:用于管理复杂的树型结构数据项,每个项都可以包含任意数据

      • QDirModel:提供本地文件系统中的文件和目录信息

      • QSqlQueryModel、QSqlTableModel、QSqlRelationTableModel:用于访问和操作数据库

(2)Tree View:树形视图

QTreeView

  • 继承关系:继承自 QAbstractItemView,被 QTreeWidget 继承

  • 功能:提供树视图的默认模型/视图实现,用于表示模型项的树结构

  • 用途:替代以前由 QListView 提供的标准分层列表,利用更灵活的模型/视图结构

用法示例

  • 要使一个 QTreeView 能够显示数据,需要
    构造一个 model 并设置 QTreeView。Qt 提供了一些类型的 Model,其中最常用的就是这个
    QStandardItemModel 类,一般可以满足大部分需求。另外,表头的内容也由这个 model 管理,
    setHorizontalHeaderLabels 函数可以设置共有多少列、每列文字。一级标题直接使用 appendRow
    方法添加到 model 上,次级标题则是添加到第一个父级标题上,依次构成父子关系树

  • 新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可

  • mainwindow.h

    • 1 #ifndef MAINWINDOW_H
      2 #define MAINWINDOW_H
      3
      4 #include
      5 #include
      6
      7 class MainWindow : public QMainWindow
      8{
      9 Q_OBJECT
      10
      11 public:
      12 MainWindow(QWidget *parent = nullptr);
      13 ~MainWindow();
      14
      15 private:
      16 QTreeView *treeView;
      17
      18 };
      19 #endif // MAINWINDOW_H
  • mainwindow.cpp

    • 1 #include “mainwindow.h”
      2
      3 #include
      4 #include
      5
      6 MainWindow::MainWindow(QWidget parent)
      7 : QMainWindow(parent)
      8{
      9 /
      设置窗口的位置与大小 /
      10 this->setGeometry(0, 0, 800, 480);
      11 /
      实例化 QTreeView 对象 /
      12 treeView = new QTreeView(this);
      13 /
      居中 /
      14 setCentralWidget(treeView);
      15
      16 /
      构建 Model /
      17 QStandardItemModel sdiModel = new QStandardItemModel(treeView);
      18 sdiModel->setHorizontalHeaderLabels(
      19 QStringList()<<QStringLiteral(“标题”)
      20 << QStringLiteral(“名称”)
      21 );
      22
      23 for(int i = 0; i < 5; i++) {
      24 /
      一级标题 /
      25 QList<QStandardItem
      > items1;
      26 QStandardItem
      item1 =
      27 new QStandardItem(QString::number(i));
      28 QStandardItem* item2 =
      29 new QStandardItem(QStringLiteral(“一级标题”));
      30 /* 添加项一 /
      31 items1.append(item1);
      32 /
      添加项二 /
      33 items1.append(item2);
      34 /
      appendRow 方法添加到 model 上 /
      35 sdiModel->appendRow(items1);
      36
      37 for(int j = 0; j < 5; j++) {
      38 /
      在一级标题后面插入二级标题 /
      39 QList<QStandardItem
      > items2;
      40 QStandardItem* item3 =
      41 new QStandardItem(QString::number(j));
      42 QStandardItem* item4 =
      43 new QStandardItem(QStringLiteral(“二级标题”));
      44 items2.append(item3);
      45 items2.append(item4);
      46 /* 使用 appendRow 方法添加到 item1 上 /
      47 item1->appendRow(items2);
      48 }
      49 }
      50 /
      设置 Model 给 treeView */
      51 treeView->setModel(sdiModel);
      52 }
      53
      54 MainWindow::~MainWindow()
      55 {
      56 }
  • main.cpp

    • 由新建项目时生成,无改动

运行效果

  • 可以点击数字来展开二级标题

(3)Table View:表视图

QTableView

  • 继承关系:继承自 QAbstractItemView,被 QTableWidget 继承

  • 功能:提供表视图的默认模型/视图实现,显示来自模型的项

  • 用途:用于替代以前由 QTable 类提供的标准表,采用更灵活的模型/视图结构

用法示例

  • 使一个 QTableView 能够显示数据,需要构
    造一个 model 并设置给 QTableView。Qt 提供了一些类型的 Model,其中最常用的就是这个
    QStandardItemModel 类,一般可以满足大部分需求。另外,表头的内容也由这个 model 管理,
    setHorizontalHeaderLabels 函数可以设置共有多少列、每列文字

  • 在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可

  • mainwindow.h

    • 1 #ifndef MAINWINDOW_H
      2 #define MAINWINDOW_H
      3
      4 #include
      5 #include
      6
      7 class MainWindow : public QMainWindow
      8{
      9 Q_OBJECT
      10
      11 public:
      12 MainWindow(QWidget *parent = nullptr);
      13 ~MainWindow();
      14
      15 private:
      16 QTableView *tableView;
      17 };
      18 #endif // MAINWINDOW_H
  • mainwindow.cpp

    • 1 #include “mainwindow.h”
      2 #include
      3 #include
      4
      5 MainWindow::MainWindow(QWidget parent)
      6 : QMainWindow(parent)
      7{
      8 /
      设置窗口的位置与大小 /
      9 this->setGeometry(0, 0, 800, 480);
      10 tableView = new QTableView(this);
      11 setCentralWidget(tableView);
      12 /
      显示网格线 /
      13 tableView->setShowGrid(true);
      14
      15 QStandardItemModel
      model = new QStandardItemModel();
      16 QStringList labels =
      17 QObject::tr(“语文,数学,英语”).simplified().split(“,”);
      18 /* 设置水平头标签 /
      19 model->setHorizontalHeaderLabels(labels);
      20
      21 /
      item /
      22 QStandardItem
      item = 0;
      23 /* model 插入项内容 /
      24 for(int i = 0; i < 5; i++){
      25 item = new QStandardItem(“80”);
      26 model->setItem(i, 0, item);
      27 item = new QStandardItem(“99”);
      28 model->setItem(i, 1, item);
      29 item = new QStandardItem(“100”);
      30 model->setItem(i, 2, item);
      31 }
      32 /
      将 model 设置给 tableView /
      33 tableView->setModel(model);
      34 /
      平均分列 /
      35 tableView->horizontalHeader()
      36 ->setSectionResizeMode(QHeaderView::Stretch);
      37 /
      平均分行 */
      38 tableView->verticalHeader()
      39 ->setSectionResizeMode(QHeaderView::Stretch);
      40 }
      41
      42 MainWindow::~MainWindow()
      43 {
      44 }
  • main.cpp

    • 由新建项目时生成,无改动

运行效果

  • 建立一个成绩表格

(4)Column View:列表视图

QColumnView

  • 继承关系:继承自 QAbstractItemView

  • 功能:在多个 QListView 中显示一个模型,每个 QListView 对应树的一个层次结构(级联列表)

  • 用途:作为模型/视图框架的一部分,显示模型提供的数据

用法示例

  • 新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可

  • mainwindow.h

    • 1 #ifndef MAINWINDOW_H
      2 #define MAINWINDOW_H
      3
      4 #include
      5 #include
      6
      7 class MainWindow : public QMainWindow
      8{
      9 Q_OBJECT
      10
      11 public:
      12 MainWindow(QWidget *parent = nullptr);
      13 ~MainWindow();
      14
      15 private:
      16 QColumnView *columnView;
      17 };
      18 #endif // MAINWINDOW_H
  • mainwindow.cpp

    • 1 #include “mainwindow.h”
      2 #include
      3
      4 MainWindow::MainWindow(QWidget parent)
      5 : QMainWindow(parent)
      6{
      7 /
      设置主窗体显示位置与大小 */
      8 this->setGeometry(0, 0, 800, 480);
      9 QStandardItemModel model = new QStandardItemModel;
      10
      11 /
      省份 */
      12 QStandardItem province = new QStandardItem(“广东省”);
      13
      14 /
      城市 */
      15 QStandardItem *city1 = new QStandardItem(“茂名市”);
      16 QStandardItem city2 = new QStandardItem(“中山市”);
      17
      18 /
      添加城市到省份下 */
      19 province->appendRow(city1);
      20 province->appendRow(city2);
      21
      22 QStandardItem *town1 = new QStandardItem(“电白镇”);
      23 QStandardItem town2 = new QStandardItem(“南头镇”);
      24
      25 /
      添加城镇到城市下 /
      26 city1->appendRow(town1);
      27 city2->appendRow(town2);
      28
      29 columnView = new QColumnView;
      30
      31 /
      建立 model /
      32 model->appendRow(province);
      33
      34 /
      设置 model /
      35 columnView->setModel(model);
      36
      37 /
      设置居中 */
      38 setCentralWidget(columnView);
      39 }
      40
      41 MainWindow::~MainWindow()
      42 {
      43 }
  • main.cpp

    • 由新建项目时生成,无改动

运行效果

  • 当点击省份出现城市,点击城市出现城镇

(5)Undo View:撤销列表视图

QUndoView

  • 继承关系:继承自 QListView

  • 功能:显示 QUndoStack 的内容,展示撤销堆栈上的命令列表

  • 用途:选择不同命令以调用 QUndoStack::setIndex(),调整文档状态;可以通过 setStack() 或 setGroup() 设置堆栈或组

    • 命令选择

      • 总是选择最近执行的命令

      • 选择不同的命令会导致调用

      • QUndoStack::setIndex(),从而将文档的状态向后或向前滚动到新的命令

用法示例

  • 新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可

  • 同时添加了两个新建文件,点击新建,选择 C++》C++ Source File 命名 command.h 和 command.cpp 文件,用于重写 QUndoCommand

  • command.h

    • 1 #ifndef COMMAND_H
      2 #define COMMAND_H
      3
      4 #include
      5 #include
      6
      7 class addCommand : public QUndoCommand
      8{
      9 public:
      10 addCommand(int value, QUndoCommand parent = 0);
      11 ~addCommand();
      12
      13 /* 重写重做与撤回方法 /
      14 void redo() override;
      15 void undo() override;
      16
      17 private:
      18 /
      新的 count */
      19 int new_count;
      20
      21 /
      旧的 count */
      22 int old_count;
      23 };
      24
      25 #endif // COMMAND_H
  • mainwindow.h

    • 1 #ifndef MAINWINDOW_H
      2 #define MAINWINDOW_H
      3
      4 #include
      5 #include
      6 #include
      7 #include
      8 #include
      9 #include
      10 #include
      11 #include <command.h>
      12
      13 class MainWindow : public QMainWindow
      14 {
      15 Q_OBJECT
      16
      17 public:
      18 MainWindow(QWidget parent = nullptr);
      19 ~MainWindow();
      20
      21 private:
      22 /
      水平布局 */
      23 QHBoxLayout hLayout;
      24 /
      水平布局 */
      25 QVBoxLayout vLayout;
      26 /
      用于容纳 hLayout 布局 */
      27 QWidget mainWidget;
      28 /
      容器作用 QWidget,用于容纳标签与按钮 */
      29 QWidget widget;
      30 /
      存放 QUndoCommand 命令的栈 */
      31 QUndoStack undoStack;
      32 /
      历史记录面板 */
      33 QUndoView undoView;
      34 /
      用于显示计算结果 */
      35 QLabel label;
      36 /
      按钮 */
      37 QPushButton pushButton;
      38 /
      计算结果 */
      39 int count;
      40
      41 private slots:
      42 void pushButtonClieked();
      43 void showCountValue(int);
      44 };
      45 #endif // MAINWINDOW_H
  • command.cpp

    • 1 #include “command.h”
      2 #include
      3
      4 addCommand::addCommand(int value, QUndoCommand parent)
      5{
      6 /
      使用 Q_UNUSED,避免未使用的数据类型 /
      7 Q_UNUSED(parent);
      8
      9 /
      undoView 显示的操作信息 /
      10 setText(“进行了加 1 操作”);
      11
      12 /
      value 的地址赋值给 new_count /
      13 new_count = value;
      14
      15 /
      让构造函数传过来的
      new_count 的值赋值给 old_count */
      16 old_count = new_count;
      17 }
      18
      19 /
      执行 stack push 时或者重做操作时会自动调用 /
      20 void addCommand::redo()
      21 {
      22 /
      重新赋值给 new_count /
      23 new_count = old_count;
      24
      25 /
      打印出
      new_count 的值 */
      26 qDebug()<<“redo:”<<new_count<<endl;
      27 }
      28
      29 /
      回撤操作时执行 /
      30 void addCommand::undo()
      31 {
      32 /
      回撤操作每次应减一 /
      33 (new_count)–;
      34
      35 /
      打印出
      new_count 的值 */
      36 qDebug()<<“undo:”<<*new_count<<endl;
      37 }
      38
      39 addCommand::~addCommand()
      40 {
      41
      42 }
  • mainwindow.cpp

    • 1 #include “mainwindow.h”
      2 #include
      3
      4 MainWindow::MainWindow(QWidget parent)
      5 : QMainWindow(parent)
      6{
      7 /
      设置主窗体显示的位置与大小 /
      8 this->setGeometry(0, 0, 800, 480);
      9
      10 /
      实例一个水平布局,用于左侧按钮区域与右侧历史记录面板 /
      11 hLayout = new QHBoxLayout();
      12
      13 /
      实例一个水平布局,用于左侧标签与按钮 /
      14 vLayout = new QVBoxLayout();
      15
      16 /
      主 Widget, 因为 MainWindow 自带一个布局,
      17 * 我们要新建一个 Widget 容纳新布局
      18 /
      19 mainWidget = new QWidget();
      20
      21 /
      用于存放命令行栈 /
      22 undoStack = new QUndoStack(this);
      23
      24 /
      用于容纳左侧标签与按钮布局 /
      25 widget = new QWidget();
      26
      27 /
      历史记录面板实例化 /
      28 undoView = new QUndoView(undoStack);
      29
      30 /
      实例一个按钮,用于加一操作 /
      31 pushButton = new QPushButton();
      32
      33 /
      标签,用于显示计算结果 /
      34 label = new QLabel();
      35
      36 /
      设置 widget 的大小 /
      37 widget->setMinimumSize(400, 480);
      38
      39 /
      将两个 widget 添加到水平布局 /
      40 hLayout->addWidget(widget);
      41 hLayout->addWidget(undoView);
      42
      43 /
      初始化 count 的值 /
      44 count = 0;
      45
      46 /
      显示初始化计算结果 /
      47 label->setText(“计算结果:” + QString::number(count));
      48 label->setAlignment(Qt::AlignCenter);
      49
      50 /
      左侧布局 /
      51 vLayout->addWidget(label);
      52 vLayout->addWidget(pushButton);
      53
      54 /
      左侧布局控件的高度设置 /
      55 label->setMaximumHeight(this->height() / 5);
      56 pushButton->setMaximumHeight(this->height() / 5);
      57
      58 /
      按钮文件设置 /
      59 pushButton->setText(“加 1”);
      60
      61 /
      设置 widget 的布局为 vLayout /
      62 widget->setLayout(vLayout);
      63
      64 /
      将主窗体的布局设置为 hLayout /
      65 mainWidget->setLayout(hLayout);
      66
      67 /
      设置 mainWidget 为主窗体的居中 widget /
      68 this->setCentralWidget(mainWidget);
      69
      70 /
      信号槽连接,按钮点击,执行加一操作 /
      71 connect(pushButton, SIGNAL(clicked()), this,
      72 SLOT(pushButtonClieked()));
      73
      74 /
      信号槽连接,历史记录项 index 发生变化,显示 count 大小 /
      75 connect(undoStack, SIGNAL(indexChanged(int) ),
      76 this, SLOT(showCountValue(int)));
      77 }
      78
      79 /
      入栈操作会自动调用 addCommand 的 redo /
      80 void MainWindow::pushButtonClieked()
      81 {
      82 /
      变量值加一 /
      83 count++;
      84
      85 /
      value 指向 count 的地址 */
      86 int value = &count;
      87
      88 /
      用重写的 addCommand 类实例化 */
      89 QUndoCommand add = new addCommand(value);
      90
      91 /
      入栈 /
      92 undoStack->push(add);
      93 }
      94
      95 void MainWindow::showCountValue(int)
      96 {
      97 /
      标签用于显示计算结果 */
      98 label->setText(“计算结果:” + QString::number(count));
      99 }
      100
      101 MainWindow::~MainWindow()
      102 {
      103
      lue 指向 count 的地址 */
      86 int value = &count;
      87
      88 /
      用重写的 addCommand 类实例化 */
      89 QUndoCommand add = new addCommand(value);
      90
      91 /
      入栈 /
      92 undoStack->push(add);
      93 }
      94
      95 void MainWindow::showCountValue(int)
      96 {
      97 /
      标签用于显示计算结果 */
      98 label->setText(“计算结果:” + QString::number(count));
      99 }
      100
      101 MainWindow::~MainWindow()
      102 {
      103
      104 }
  • main.cpp

    • 由新建项目时生成,无改动

运行效果

  • 点击“加 1”按钮,计算结果将加 1,用方向键或者鼠标进行选择右边的历史记录面板将进行重做或者回撤操作,同时应用程序输出窗口打印出 debug 信息,计算结果也将回到该步时的计算结果

undefined
undefined
undefined
undefined
undefined

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

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

相关文章

通过连接数据库演示解耦过程

一、什么是解耦&#xff1f; 解耦就是为了降低程序之间的耦合性&#xff0c;在软件工程中&#xff0c;对象之间的耦合度就是对象之间的关联度。程序之间耦合度越高&#xff0c;程序维护起来也就越困难&#xff0c;即程序维护成本高。所以我们需要通过现有方法降低耦合性&#x…

oss学习问题记录

1.在使用oss上传文档时&#xff0c;根据返回的地址访问上传的图片&#xff0c;会报错误如下&#xff1a;This XML file does not appear to have any style information associated with it. The document tree is shown below. 在设置了上传的文档类型和代码设置读写权限之后 …

Redis的基本概念和使用

目录 一、Redis简介 1、NOSQL 2、NOSQL和关系型数据库比较 3、主流的NOSQL产品 4、什么是Redis 5、启动Redis 二、Redis基本操作 1、大概操作 三、 Redis 数据类型&#xff08;5种常用&#xff09; 1、redis 数据存储格式 2、String 3、hash 4、list 5、Set 6、…

面试题-Spring Bean的生命周期

文章目录 Spring Bean 生命周期分为哪几个阶段浅析Bean生命周期源码实现1.1 DefaultListableBeanFactory1.2 createBean2.1 populateBean3.1 initializeBean3.2 invokeInitMethod3.3 applyBeanPostProcessorsBeforeInitialization5.1 destroyBean5.2 invokeDestroyMethod Sprin…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入bilibili官网中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要…

一次评审会议上的纠偏

这段时间&#xff0c;整个项目组都投入在某个专项项目中&#xff0c;评审和版本迭代的频率也很高。而在近期的评审会上&#xff0c;发生了一起激烈的争辩&#xff0c;也让我意识到大多数产品人身上的通病&#xff0c;觉得挺有意义的&#xff0c;借此分享给大家。 同事A最近在做…

Qt窗口交互场景、子窗口数据获取

一、前言 在现代软件开发中&#xff0c;图形用户界面&#xff08;GUI&#xff09;的设计不仅仅关乎美观&#xff0c;更在于用户体验和功能的无缝衔接。Qt框架以其强大的跨平台能力和丰富的组件库&#xff0c;成为众多开发者构建GUI应用的首选工具。在Qt应用中&#xff0c;窗口…

​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​

目录 微机原理判断指令是否正确【见的多了&#xff0c;你就懂了~】 1. 立即数不能作为目标操作数 2. 操作数位数必须匹配 3. 需要指定存储器操作数的字节或字 4. 两个操作数不能同时为存储器操作数 5. 循环次数超过1必须使用CL寄存器 6. 段寄存器限制&#xff08;特别是…

比OpenAI的Whisper快50%,最新开源语音模型

生成式AI初创公司aiOla在官网开源了最新语音模型Whisper-Medusa&#xff0c;推理效率比OpenAI开源的Whisper快50%。 aiOla在Whisper的架构之上进行了修改采用了“多头注意力”机制的并行计算方法&#xff0c;允许模型在每个推理步骤中预测多个token&#xff0c;同时不会损失性…

[000-01-010].第02节:Spring基础开发环境搭建

1.1.新建空项目&#xff1a; 1.新建Empty项目&#xff0c;主要是为了方便之后把各个模块的代码统一的放在一起&#xff1a; 2.设置JDK&#xff1a; 3.设置maven版本&#xff1a; 1.2.建立第一个Spring项目模块&#xff1a; 1.新建模块&#xff1a; 2.配置依赖&#xff…

gitlab自动部署是什么 gitlab自动部署如何进行操作

在现代软件开发流程中&#xff0c;自动化部署是提高效率和确保软件质量的关键环节。GitLab作为一个强大的DevOps平台&#xff0c;提供了完整的自动部署工具&#xff0c;帮助开发团队实现代码从编写到生产的无缝转换。本文将详细解析GitLab的自动部署功能是什么&#xff0c;如何…

走向绿色:能源新选择,未来更美好

当前&#xff0c;全球范围内可再生能源正经历着从辅助能源向核心能源的深刻转型&#xff0c;绿色能源日益渗透至居住、出行、日常应用等多个领域&#xff0c;深刻影响着我们的生活方式&#xff0c;使我们能够更加充分地体验清洁能源所带来的优质生活。 一、绿色能源与“住” …

Fluent学习笔记——催化转化器内流场仿真(含多孔介质)

参考课程&#xff1a; 标题&#xff1a;【ANSYS Fluent教程|流体仿真基础入门105讲&#xff08;官方最新案例讲解&#xff09;】 作者&#xff1a;仿真秀APP 选集&#xff1a;P35-P40https://www.bilibili.com/video/BV1vT4y1z7on?p35&vd_source7e977d0187273d77005659cdd…

数据结构(03):线性表的逻辑结构

线性表的逻辑结构 在谈论逻辑结构的时候&#xff0c;我们不讨论具体数据在物理内存中的存储细节&#xff0c;而只关注线性表的逻辑结构。数据结构系列文章02介绍过常见的逻辑结构有&#xff1a;集合、线性表结构、树结构和图结构等。 A.What&#xff08;什么是线性表&#xff0…

什么是凤凰雪球期权?和雪球期权有什么区别?

凤凰结构&#xff0c;和经典雪球结构类似&#xff0c;属于障碍期权的一种。凤凰结构中包括敲入事件&#xff0c;也包括敲出事件&#xff0c;最后的收益取决于挂钩标的走势和敲入、敲出事件发生的时间&#xff0c;不过在收益计算规则上与雪球有所不同&#xff0c;下文为大家科普…

deepin V23 Release 安装与功能介绍!!!

原文链接&#xff1a;deepin V23 Release 安装与功能介绍&#xff01;&#xff01;&#xff01; Hello&#xff0c;大家好啊&#xff01;2024年8月15日&#xff0c;deepin正式发布了最新版操作系统——deepin V23。今天&#xff0c;我将为大家带来一篇关于deepin V23的安装及功…

python完整爬取工商数据代码实例+数据展示

在数据爬虫这个领域&#xff0c;我早已不再是新手&#xff0c;而是一位经验丰富的老手。长期以来&#xff0c;我通过不断实践和探索&#xff0c;掌握了一系列高效的爬虫技术&#xff0c;特别是在应对复杂网页和动态数据时&#xff0c;更是积累了独特的经验。 初识爬虫&#xf…

SAP BRIM用于应收账款AR收入中台

SAP BRIM&#xff08;Billing and Revenue Innovation Management&#xff09;是SAP提供的一个综合性解决方案&#xff0c;旨在帮助企业高效管理计费和收入流程。它与SAP ERP系统集成&#xff0c;提供端到端的功能&#xff0c;简化计费流程&#xff0c;自动化收入确认&#xff…

【云原生】Ingress控制器超级详解

Ingress资源对象 文章目录 Ingress资源对象一、Ingress1.1、Ingress是什么&#xff1f;1.2、Ingress术语1.3、Ingress类型 二、Ingress详细2.1、部署Nginx-Ingress控制器2.2、最小Ingress资源2.3、Ingress规则 三、一个域名多个访问路径多SVC四、多域名Ingress五、转发到默认Se…

基于Java+SpringBoot+Vue的网上购物商城系统研发

基于JavaSpringBootVue的网上购物商城系统研发 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f3…