【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型

1. 引入

QStandardItemModel类提供了一个通用的模型,用于存储自定义数据。
以下是其用法:该类属于gui模块,因此在.pro中,需添加QT += gui,如果已存在,则无需重复添加。
首先,引入头文件:

#include <QStandardItemModel> 

2. 描述

以下介绍很重要,可以慢下心来阅读。
QStandardItemModel类提供了一个用于存储自定义数据的通用模型。
QStandardItemModel可以用作标准Qt数据类型的存储库。它是模型/视图类之一,是Qt模型/视图框架的一部分。
QStandardItemModel提供了一种经典的基于项目的方法来处理模型。QStandardItemModel中的项由QStandardItem提供。
QStandardItemModel实现了QAbstractItemModel接口,这意味着该模型可以用于在任何支持该接口的视图中提供数据(例如QListView, QTableViewQTreeView,以及您自己的自定义视图)。为了提高性能和灵活性,您可能希望创建QAbstractItemModel的子类,以便为不同类型的数据存储库提供支持。例如,QDirModel为底层文件系统提供了一个模型接口。
当您需要一个列表或树时,您通常会创建一个空的QStandardItemModel,并使用appendRow()向模型中添加项目,并使用item()访问项目。如果您的模型表示一个表,您通常将表的尺寸传递给QStandardItemModel构造函数,并使用setItem()将项目定位到表中。您还可以使用setRowCount()setColumnCount()来更改模型的尺寸。要插入项,使用insertRow()insertColumn(),要删除项,使用removeRow()removeColumn()
您可以使用setHorizontalHeaderLabels()setVerticalHeaderLabels()设置模型的标题标签。
您可以使用findItems()在模型中搜索项目,并通过调用sort()对模型进行排序。
调用clear()从模型中删除所有项。
QStandardItemModel创建表的一个示例:

  QStandardItemModel model(4, 4);
  for (int row = 0; row < 4; ++row) {
      for (int column = 0; column < 4; ++column) {
          QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
          model.setItem(row, column, item);
      }
  }

QStandardItemModel创建树的一个例子:

  QStandardItemModel model;
  QStandardItem *parentItem = model.invisibleRootItem();
  for (int i = 0; i < 4; ++i) {
      QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
      parentItem->appendRow(item);
      parentItem = item;
  }

在视图上设置模型之后,您通常希望对用户操作做出反应,例如单击项。由于QAbstractItemView提供了基于QModelIndex的信号和函数,您需要一种方法来获得与给定的QModelIndex相对应的QStandardItem,反之亦然。itemFromIndex()indexFromItem()提供了这种映射。itemFromIndex()的典型用法包括获取视图中当前索引处的项,以及获取与QAbstractItemView信号携带的索引对应的项,例如QAbstractItemView::clicked()。首先,你将视图的信号连接到类中的槽:

  QTreeView *treeView = new QTreeView(this);
  treeView->setModel(myStandardItemModel);
  connect(treeView, SIGNAL(clicked(QModelIndex)),
          this, SLOT(clicked(QModelIndex)));

当你收到信号时,你调用itemFromIndex()在给定的模型索引上获得一个指向项目的指针:

  void MyWidget::clicked(const QModelIndex &index)
  {
      QStandardItem *item = myStandardItemModel->itemFromIndex(index);
      // Do stuff with the item ...
  }

相反,当您想调用以索引作为参数的模型/视图函数时,您必须获得项目的QModelIndex。您可以通过使用模型的indexFromItem()函数或调用QStandardItem::index()来获得索引:

  treeView->scrollTo(item->index());

当然,您不需要使用基于项目的方法;在使用模型时,您可以完全依赖于QAbstractItemModel接口,或者使用两者的适当组合。

常用方法

  1. QStandardItemModel::QStandardItemModel(QObject *parent = Q_NULLPTR)
    构造一个带有给定父对象的新项模型。

  2. QStandardItemModel::QStandardItemModel(int rows, int columns, QObject *parent = Q_NULLPTR)
    构造一个初始具有rows行和columns列的新项模型,并给它指定一个父对象。

  3. QStandardItemModel::~QStandardItemModel()
    销毁模型。模型会销毁所有的项。

  4. voidStandardItemModel::appendColumn(const QList<QStandardItem *> &items)
    追加一个包含项的列。如果需要,行数将增加到items的大小。

  5. void QStandardItemModel::appendRow(const QList<QStandardItem *> &items)
    追加一个包含项的行。如果需要,列数将增加到items的大小。

  6. void QStandardItemModel::appendRow(QStandardItem *item)
    这是一个重载函数。
    当构建只有一列的列表或树时,此函数提供了一种方便的方法来追加一个新的项。

  7. void QStandardItemModel::clear()
    从模型中移除所有的项(包括标题项),并将行数和列数设为0。

  8. [virtual] int QStandardItemModel::columnCount(const QModelIndex &parent = QModelIndex()) const
    从QAbstractItemModel::columnCount()重新实现。

  9. [virtual] QVariant QStandardItemModel::data(const QModelIndex &index, int role = QtDisplayRole) const
    从QAbstractItemModel::data()重新实现。

  10. [virtual] bool QStandardItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
    从QAbstractItemModel::dropMimeData()重新实现。

  11. QList<QStandardItem *> QStandardItemModel::findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const
    返回与给定文本匹配的项列表,使用给定的标志,在给定列中进行搜索。

  12. [virtual] Qt::ItemFlags QStandardItemModel::flags(const QModelIndex &index)
    从QAbstractItemModel::flags()重新实现。

  13. [virtual] bool QStandardItemModel::hasChildren(const QModelIndex &parent = QModelIndex()) const
    从QAbstractItemModel::hasChildren()重新实现。

  14. QVariant QStandardItemModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
    从QAbstractItemModel::headerData()重新实现。

  15. QStandardItem *QStandardItemModel::horizontalHeaderItem(int column) const
    返回指定列的水平标题项(如果已设置),否则返回。

  16. [virtual] QModelIndex QStandardItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex()) const
    从QAbstractItemModel::index()重新实现。

  17. QModelIndex QStandardItemModel::indexFromItem(const QStandardItem *item) const
    返回与给定项关联的QModelIndex。
    在执行需要项的QModelIndex的操作时使用此函数,例如QAbstractItemView::scrollTo()。QStandardItem::index()提供了方便的方式来调用此函数。

  18. void QStandardItemModel::insertColumn(int column, const QList<QStandardItem *> &items)
    在指定列中插入包含项的列。如果需要,行数将增加到items的大小。

  19. bool QStandardItemModel::insertColumn(int column, const QModelIndex &parent = QModelIndex())
    在指定的父项的子项中的指定列之前插入单个列。如果插入列成功则返回true否则返回false。

  20. `[virtual] bool QStandardItemModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())
    从QAbstractItemModel::insertColumns()重新实现。

  21. void QStandardItemModel::insertRow(int row, const QList<QStandardItem *> &items)
    在指定行中插入包含项的行。如果需要,列数将增加到items的大小。

  22. void QStandardItemModel::insertRow(int row, QStandardItem *item)
    这是一个重载函数。
    在指定行中插入包含item的行。
    当构建只有一列的列表或树时,此函数提供了一种方便的方法来追加一个新的项。

  23. bool QStandardItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex())
    在指定的父项的子项中的指定行之前插入单个行。如果插入行成功则返回true,否则返回false。

  24. [virtual] bool QStandardItemModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
    从QAbstractItemModel::insertRows()重新实现。

  25. QStandardItem *QStandardItemModel::invisibleRootItem() const
    返回模型的不可见根项。
    通过QStandardItem API,不可见的根项提供对模型的顶级项的访问,以使得可以以统一的方式处理顶级项及其子项;例如,涉及树模型的递归函数。
    注意:调用从此函数获取的QStandardItem对象上的index()无效。

  26. QStandardItem *QStandardItemModel::item(int row, int column = 0) const
    返回给定行和列的项(如果已设置),否则返回0。

  27. [signal] void QStandardItemModel::itemChanged(QStandardItem *item)
    在项的数据发生更改时发出此信号。

  28. [virtual] QMap<int, QVariant> QStandardItemModel::itemData(const QModelIndex &index) const
    从QAbstractItemModel::itemData()重新实现。

  29. QStandardItem *QStandardItemModel::itemFromIndex(const QModelIndex &index) const
    返回与给定索引关联的QStandardItem指针。
    在处理来自视图的基于QModelIndex的信号(如QAbstractItemView::activated())时,通常调用此函数是初始步骤。在您的槽中,您调用itemFromIndex(),传入信号携带的QModelIndex作为参数,以获得指向相应QStandardItem的指针。
    注意,如果不存在指定索引处的项,此函数将懒惰地创建一个项(使用itemPrototype()),并在父项的子项表中设置它。
    如果索引无效,则此函数返回0。

  30. const QStandardItem *QStandardItemModel::itemPrototype() const
    返回模型使用的项原型。当模型在需要按需构造新项时(例如,当视图或项代理调用setData()时),模型使用项原型作为项工厂。

  31. [virtual] QMimeData *QStandardItemModel::mimeData(const QModelIndexList &indexes) const
    从QAbstractItemModel::mimeData()重新实现。

  32. [virtual] QStringList QStandardItemModel::mimeTypes() const
    从QAbstractItemModel::mimeTypes()重新实现。

  33. [virtual] QModelIndex QStandardItemModel::parent(const QModelIndex &child) const
    从QAbstractItemModel::parent()重新实现。

  34. [virtual] bool QStandardItemModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
    从QAbstractItemModel::removeColumns()重新实现。

  35. [virtual] bool QStandardItemModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
    从QAbstractItemModel::removeRows()重新实现。

  36. [virtual] int QStandardItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const
    从QAbstractItemModel::rowCount()重新实现。

  37. void QStandardItemModel::setColumnCount(int columns)
    将模型中的列数设置为columns。如果小于columnCount(),则将丢弃不需要的列的数据。

  38. [v] bool QStandardItemModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
    从QAbstractItemModel::setData重新实现。

  39. [virtual] bool QStandardItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariantvalue, int role = Qt::EditRole)
    从QItemModel::setHeaderData重新实现。

  40. void QStandardItemModel::setHorizontalHeaderItem(int column, QStandardItem *item)
    将列column的水平标题项设置为item。模型将拥有该项。需要,将增加数以适应该项。先前的标题项(如果有)将被删除。

  41. void QStandardItemModel::setHeaderLabels(const QStringList &labels)
    使用labels设置水平标题签。如果需要,将增加列数以与标签大小相匹配。

  42. void QStandardItemModel::setItem(int row, int column, QStandardItem *item)
    将给定行和列项设置为item。模型将拥有该项。如果需要,增加行数和列数以适应该项。给定位置先前项(如果有)将被删除。

  43. [virtual bool QStandardItemModel::setItem(const QModelIndex &index, const QMap<int,> &roles)
    从QItemModel::setItemData()重新实现。

  44. void QStandardItemModel::setItemPrototype(const QStandardItem *item)
    将型的项原型设置为指定的项。模型将拥有该原型。
    项原型通过依赖QStandardItem::clone()函数来充当QStandardItem工厂。要提供自己的原型子类化QStandardItem,重新实现QStandardItem::clone()并将原设置为您自定义类的实例。每当QStandardItemModel需要按需创建项(例如,当视图或项委托调用setData()时),新项将是您自定义类的实例。

  45. void QStandardItemModelsetItemRoleNames(const QHash, QByteArray> &roleNames)
    将项角色名称设置为roleNames。
    void QStandardItemModel::setRowCount(int rows)
    模型中的行数为rows。如果小于rowCount(),则丢弃不需要的行数据。

  46. void StandardItemModel::setVerticalHeaderItem(int row, QStandardItem *item)
    将行row的垂直标题项设置为item模型将拥有该项。如果需要,将加行数以适应该项。先前的标题项(有)将被删除。

  47. void QStandardItemModel::setHeaderLabels(const QStringList &labels)
    使用labels设置垂直标题标签。如果需要,将增加行数以与标签大小相匹配。

  48. [virtual] QModelIndex QStandardItemModel::sibling(int row, int column, const QModelIndex &idx) const
    从QAbstractItemModel::sibling()重新实现。

  49. [virtual] void QStandardItemModel::sort(int, Qt::SortOrder order = Qt::Order)
    从QAbstractItemModel::sort()重新实现。

  50. [virtual] Qt::DropActions QStandardItemModel::supportedDropActions() const
    从QAbstractItemModel::supportedDropActions()重新实现。
    QStandardItemModel支持复制和移动。

  51. QList<QStandardItem *> QModel::takeColumn(int column)
    移除给定列而不删除列项,并指向删除的项的指针列表。模型释对项的所有权。对于未设置的列中的项,列表中相应指针将为0。

  52. QStandardItem *QStandardItem::takeHorizontalHeaderItem(int column)
    从中移除位于column的水平项而不删除它,并返回该项的指针。模型释放对该项的所有权。

  53. QStandardItem *QStandardItemModel::take(int row, int column =0)
    移除(row,column)位置的项,不删除它。模型释放对该项所有权。

  54. QList<QStandardItem *> QModel::takeRow(int row)
    移除给定行而不删除行项,并返回指向删除的项的指针列表。模型释放对项所有权。对于未设置的行中的项,列表中相应指针将为0。

  55. QStandardItem *QStandardItemModel::takeVerticalHeaderItem(int row)
    从标题中移除位于row的垂直标题项而不删除,并返回该项的指。模型释放对项的所有权。

  56. QStandardItem *QStandardItemModel::verticalHeaderItem(int row) const
    如果已设置,则返回row的垂直标题项;否则0。

示例

基于列表模型
#include <QtWidgets/QApplication>
#include <QtWidgets/QListView>
#include <QtGui/QStandardItemModel>
#include <QtGui/QStandardItem>
#include <QtCore/QModelIndex>
#include <QtCore/QDebug>
#include <QtCore/QObject>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QListView listView;
    QStandardItemModel model;

    // 添加行列数据
    QList<QStandardItem *> items;
    items.append(new QStandardItem(QStringLiteral("行1-列1")));
    items.append(new QStandardItem(QStringLiteral("行1-列2")));
    model.appendRow(items);
    items.clear();
    items.append(new QStandardItem(QStringLiteral("行2-列1")));
    items.append(new QStandardItem(QStringLiteral("行2-列2")));
    model.appendRow(items);

    // 设置model
    listView.setModel(&model);

    // 处理item点击事件
    QObject::connect(&listView, &QListView::clicked, [&](const QModelIndex &index) {
        // 获取点击的item
        QStandardItem *item = model.itemFromIndex(index);
        qDebug() << item->text();

        // 将item转换成index
        QModelIndex indexFromItem = model.indexFromItem(item);

        // 将index转换成item
        QStandardItem *itemFromIndex = model.itemFromIndex(indexFromItem);

        // 设置样式
        itemFromIndex->setBackground(QBrush(QColor(Qt::red)));
    });

    listView.show();

    return a.exec();
}

在这里插入图片描述

基于树模型
#include <QtWidgets>

int main(int argc, char *argv[]) 
{
    QApplication app(argc, argv);

    // 创建 QTreeView 和 QStandardItemModel
    QTreeView treeView;
    QStandardItemModel model;
    treeView.setModel(&model);

    // 创建列标题
    QStringList headerLabels;
    headerLabels << "Name" << "Size" << "Date Modified";
    model.setHorizontalHeaderLabels(headerLabels);

    // 添加数据
    QList<QStandardItem *> items;
    items << new QStandardItem("File1.txt") << new QStandardItem("10 KB") << new QStandardItem("2021-01-01");
    model.appendRow(items);

    // 获取点击的 item,并将 item 转换为 index 和 item
    QObject::connect(&treeView, &QTreeView::clicked, [&model](const QModelIndex &index){
        QStandardItem *item = model.itemFromIndex(index);
        qDebug() << "Clicked item: " << item->text();
    });

    // 设置样式
    QString styleSheet = "QTreeView::item:selected { background-color: yellow; }";
    treeView.setStyleSheet(styleSheet);

    // 显示窗口
    treeView.show();
    return app.exec();
}

在这里插入图片描述

基于表格模型
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建模型
    QStandardItemModel model;
    model.setHorizontalHeaderLabels({"Name", "Age", "Gender"});

    // 添加数据
    QList<QStandardItem*> rowData;
    rowData << new QStandardItem("John") << new QStandardItem("25") << new QStandardItem("Male");
    model.appendRow(rowData);
    rowData.clear();
    rowData << new QStandardItem("Jane") << new QStandardItem("30") << new QStandardItem("Female");
    model.appendRow(rowData);

    // 创建表格视图
    QTableView tableView;
    tableView.setModel(&model);

    // 设置样式
    tableView.setStyleSheet("QTableView { border: 1px solid black } QTableView::item { padding: 5px }");

    // 获取点击的item
    QObject::connect(&tableView, &QTableView::clicked, [&model](const QModelIndex& index){
        QStandardItem* item = model.itemFromIndex(index);
        if(item) {
            qDebug() << "Clicked item:" << item->text();
        }
    });
    // 当item改变时,触发
    QObject::connect(&model, &QStandardItemModel::itemChanged, [&model](QStandardItem *item){
        // QStandardItem* item = model.itemFromIndex(index);
        if(item) {
            qDebug() << "Changed item:" << item->text();
        }
    });

    // 显示表格视图
    tableView.show();

    return a.exec();
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM 版 Kylin V10 部署 KubeSphere 3.4.0 不完全指南

前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版麒麟 V10 安装部署 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ksp-master-1172.16.33.1681650200KubeSphere/k8…

hash 哈希表

哈希表是一种期望算法。 一般情况下&#xff0c;哈希表的时间复杂度是 O(1)。 作用 将一个复杂数据结构映射到一个较小的空间 0~N&#xff08;10^5~10^6&#xff09;&#xff0c;最常用的情景&#xff1a;将 0~10^9 映射到 0~10^5。 离散化是一种及其特殊的哈希方式。离散化…

【SAP-ABAP】--MRKO隐式增强字段步骤

业务需求&#xff1a;给MRKO增加几个增强字段 给标准表进行增强 1.如果标准表或者结构&#xff0c;带CL_***&#xff0c;一般表示SAP预留的增强位置&#xff0c;可以 直接双击这个类型&#xff0c;点击创建&#xff0c;然后直接在预留的结构里面添加自己 需要增加的字段 2.如…

无线物理层安全大作业

这个标题很帅 Beamforming Optimization for Physical Layer Security in MISO Wireless NetworksProblem Stateme![在这里插入图片描述](https://img-blog.csdnimg.cn/58ebb0df787c4e23b0c7be4189ebc322.png) Beamforming Optimization for Physical Layer Security in MISO W…

wpf devexpress Property Grid创建属性定义

WPF Property Grid控件使用属性定义定义如何做和显示 本教程示范如何绑定WP Property Grid控件到数据和创建属性定义。 执行如下步骤 第一步-创建属性定义 添加PropertyGridControl组件到项目。 打开工具箱在vs&#xff0c;定位到DX.23.1: Data 面板&#xff0c;选择Prope…

Spring 如何自己创建一个IOC 容器

IOC(Inversion of Control),意思是控制反转&#xff0c;不是什么技术&#xff0c;而是一种设计思想&#xff0c;IOC意味着将你设计好的对象交给容器控制&#xff0c;而不是传统的在你的对象内部直接控制。 在传统的程序设计中&#xff0c;我们直接在对象内部通过new进行对象创建…

ssrf学习笔记总结

SSRF概述 ​ 服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户指定的URL&#xff0c;Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。 ​ 如果没有对用户提交URL 和远端服务器所返回的信息做合适的验证或过滤&#xff0c;就有可能存在“请求伪造”的…

新品首发 | HP1011:高性能双相交错 PFC 数字控制器

随着PFC技术的发展&#xff0c;不断有新型PFC拓扑结构提出&#xff0c;如单相PFC、交错并联 PFC、传统无桥PFC、图腾柱无桥 PFC等。交错Boost PFC系统不仅具有并联系统的所有优点&#xff0c;还能减少输入电流纹波&#xff0c;降低开关管的电流应力。在中大功率场所通常采用工作…

【汇编】栈及栈操作的实现

文章目录 前言一、栈是什么&#xff1f;二、栈的特点三、栈操作四、8086cpu操作栈4.1 汇编指令4.2 汇编代码讲解问题&#xff1a;回答&#xff1a; 4.3 栈的操作4.3 push 指令和pop指令的执行过程执行入栈(push)时&#xff0c;栈顶超出栈空间执行出栈(pop)时&#xff0c;栈顶超…

图像分类系列(四) InceptionV2-V3学习详细记录

前言 上一篇我们介绍了Inception的原始版本和V1版本&#xff1a;经典神经网络论文超详细解读&#xff08;三&#xff09;——GoogLeNet学习笔记&#xff08;翻译&#xff0b;精读代码复现&#xff09; 这个结构在当时获得了第一名&#xff0c;备受关注。但InceptionV1是比较复…

机器学习第4天:模型优化方法—梯度下降

文章目录 前言 梯度下降原理简述 介绍 可能的问题 批量梯度下降 随机梯度下降 基本算法 存在的问题 退火算法 代码演示 小批量梯度下降 前言 若没有机器学习基础&#xff0c;建议先阅读同一系列以下文章 机器学习第1天&#xff1a;概念与体系漫游-CSDN博客 机器学习…

随着大模型中数据局限问题的严峻化,向量数据库应运而生

向量数据库与亚马逊大模型 什么是向量数据库 向量嵌入&#xff08;vector embedding&#xff09;已经无处不在。它们构成了许多机器学习和深度学习算法的基础&#xff0c;被广泛运用于各种应用&#xff0c;从搜索引擎到智能助手再到推荐系统等。通常&#xff0c;机器学习和深度…

解析 Python requests 库 POST 请求中的参数顺序问题

在这篇文章中&#xff0c;我们将探讨一个用户在使用Python的requests库进行POST请求时遇到的问题&#xff0c;即参数顺序的不一致。用户通过Fiddler进行网络抓包&#xff0c;发现请求体中的参数顺序与他设置的顺序不符。我们将深入了解POST请求的工作原理&#xff0c;并提供解决…

使用requests库设置no_proxy选项的方法

问题背景 在使用requests库进行HTTP请求时&#xff0c;如果需要使用爬虫IP服务器&#xff0c;可以通过设置proxies参数来实现。proxies参数是一个字典&#xff0c;其中包含了爬虫IP服务器的地址和端口号。然而&#xff0c;当前的requests库并不支持通过proxies参数来设置no_pr…

DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

c题目9:证明1000以内的偶数可以写成两个质数之和

每日小语 心若没有栖息的地方&#xff0c;在哪都是流浪。——三毛 自己敲写 这里需要用到一个联系&#xff1a;oushuprime1prime2 这个问题在于将这个联系变换&#xff0c;用于让我们判断是否是质数&#xff0c;转换后可以方便清晰的理解&#xff0c;并且减掉一个变量。 这…

3.ubuntu20.04环境的ros搭建

ros搭建比较简单&#xff0c;主要步骤如下&#xff1a; 1.配置ros软件源&#xff1a; sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list 2.配置密钥 sudo apt-key adv --keyser…

MATLAB 模型预测控制(MPC)控制入门 —— 设计并仿真 MPC 控制器

系列文章目录 文章目录 系列文章目录前言一、使用 MPC Designer 设计控制器1.1 CSTR 模型1.2 导入被控对象并定义 MPC 结构1.3 定义输入和输出通道属性1.4 配置仿真场景1.5 配置控制器水平线1.6 定义输入约束条件1.7 指定控制器调整权重1.8 消除输出超调1.9 测试控制器抗干扰能…

node 第十九天 使用node插件node-jsonwebtoken实现身份令牌jwt认证

实现效果如下 前后端分离token登录身份验证效果演示 node-jsonwebtoken 基于node实现的jwt方案&#xff0c; jwt也就是jsonwebtoken, 是一个web规范可以去了解一下~ 一个标准的jwt由三部分组成 第一部分&#xff1a;头部 第二部分&#xff1a;载荷&#xff0c;比如可以填入加密…

探索Scrapy中间件:自定义Selenium中间件实例解析

简介 Scrapy是一个强大的Python爬虫框架&#xff0c;可用于从网站上抓取数据。本教程将指导你创建自己的Scrapy爬虫。其中&#xff0c;中间件是其重要特性之一&#xff0c;允许开发者在爬取过程中拦截和处理请求与响应&#xff0c;实现个性化的爬虫行为。 本篇博客将深入探讨…