当前位置: 首页 > news >正文

表格控件QTableWidget

下面说一下表格的常用方法

行列数目、行表头、列表头

行表头:就是表格控件的第一行,用于设置每一列的标题

列表头:就是表格控件的第一列,用于设置每一行的标题,通常缺省则默认显示行号

设置和获取行列的数目

添加n行或者n列数据之前,需要先把行设置为n或者列设置为n,开辟好空间,才能往表格里面填充数据

// 获取/设置行的数目
int rowCount() const
void setRowCount(int rows)// 获取/设置列的数目    
int columnCount() const
void setColumnCount(int columns)

插入行列

在插入一行或一列数据之前,我们要先插入一行空行或者空列来开辟空间,然后再填充数据

//在指定行号或者列号处插入一行空行或者空列
void QTableWidget::insertRow(int row)
void QTableWidget::insertColumn(int column)

删除行或列

//删除指定行或列的数据
void QTableWidget::removeRow(int row)
void QTableWidget::removeColumn(int column)

获取当前行或列(项)

获取选中行或列(项)

和当前行或列(项)有区别,只有选中了表格中的某些数据,才能获取到选中行或列(项)

//获取选中的单元格,返回1个列表,可以有多个
QList<QTableWidgetItem *> QTableWidget::selectedItems() const//获取选中的范围,QTableWidgetSelectionRange类提供方法可以获取到选中的行数,列数,开始行,结束行,开始列,结束列
QList<QTableWidgetSelectionRange> QTableWidget::selectedRanges() const

获取和设置每一个单元格项

//根据行号和列号来设置该单元格的item
void QTableWidget::setItem(int row, int column, QTableWidgetItem *item)//根据行号和列号来获取该单元格的item
QTableWidgetItem *QTableWidget::item(int row, int column) const

设置和获取行表头和列表头

// 设置行表头,参数是一个string list,可一次性设置多个列的列名
void setHorizontalHeaderLabels(const QStringList &labels)
// 获取行表头
QHeaderView *horizontalHeader() const// 设置列表头 - 通常不设置,则默认为行号
void setVerticalHeaderLabels(const QStringList &labels)
// 获取列表头
QHeaderView *verticalHeader() const

设置列宽

// 设置列的宽度 ,QHeaderView类的方法   
void QHeaderView::setSectionResizeMode(QHeaderView::ResizeMode mode)

ResizeMode是枚举,有4种取值

  • QHeaderView::Interactive:用户可拖动改变列宽
  • QHeaderView::Fixed:固定列宽
  • QHeaderView::Stretch:拉伸自适应列宽大小
  • QHeaderView::ResizeToContents:根据内容设置列宽

通常,我们将整体先设置为QHeaderView::Stretch,然后根据需要对单独的列设置


// 1、先整体设置为自适应宽度,再单独设置某一列的宽度规则
ui->twStudent->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 2、然后,单独设置第一列根据内容调整宽度,
// ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);//或者单独设置第一列为固定宽度
ui->twStudent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->twStudent->setColumnWidth(0, 80);

单元格

每个网格单元称为1个单元格。每个单元格都有1个行号和列号

QTableWidget控件中,每一个单元格都是1个QTableWidgetItem对象,可以设置其文字内容等

获取和设置单元格

// 获取和设置指定行列位置的单元格
QTableWidgetItem *item(int row, int column) const;
void setItem(int row, int column, QTableWidgetItem *item)// 构造 QTableWidgetItem
QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type)
QTableWidgetItem(const QString &text, int type = Type)

单元格对齐方式

是QTableWidgetItem类的方法

// 获取和设置单元格文本的对齐方式,是QTableWidgetItem类的方法
int textAlignment() const
void setTextAlignment(int alignment)

alignment取值

  • Qt::AlignLeft 水平方向-左对齐
  • Qt::AlignRight 水平方向-右对齐
  • Qt::AlignHCenter 水平方向-居中对齐
  • Qt::AlignTop 垂直方向-上对齐
  • Qt::AlignBottom 垂直方向-下对齐
  • Qt::AlignVCenter 垂直方向-居中对齐
  • Qt::AlignCenter(AlignVCenter | AlignHCenter) 垂直方向和水平方向-居中对齐

单元格是否可编辑

// 获取和设置单元格是否可编辑
QAbstractItemView::EditTriggers editTriggers() const
void setEditTriggers(QAbstractItemView::EditTriggers triggers)

triggers取值

  • AbstractItemView::NoEditTriggers 不可编辑
  • QAbstractItemView::CurrentChanged 当切换单元格时
  • QAbstractItemView::DoubleClicked 当双击单元格时
  • QAbstractItemView::SelectedClicked 当单击一个已选中的单元格时
  • QAbstractItemView::EditKeyPressed 当一个单元格获取焦点,按编辑按键时(F2)
  • QAbstractItemView::AnyKeyPressed 当一个单元格获取焦点,按任意键时
  • QAbstractItemView::AllEditTriggers 以上所有条件的组合。(31 = 1|2|4|8|16)

隔行交替背景色

即奇数行和偶数行的背景色不同,便于用户浏览

// 获取和设置是否允许隔行交替背景色(该接口Win11失效)
bool alternatingRowColors() const
void setAlternatingRowColors(bool enable)

选择行为

单击一个单元格时,是选中该单元格,还是选中一整行,或是一整列

// 获取和设置选择行为
QAbstractItemView::SelectionBehavior selectionBehavior() const
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)

 behavior有3种取值

  • QAbstractItemView::SelectItems 选中单元格
  • QAbstractItemView::SelectRows 选中单元格所在行
  • QAbstractItemView::SelectColumns 选中单元格所在列

选择模式

即表格控件只能选择单行,或者可以ctrl键或shift键一次性选择多行

// 获取和设置选择模式
QAbstractItemView::SelectionMode selectionMode() const
void setSelectionMode(QAbstractItemView::SelectionMode mode)

mode有5种取值

  • QAbstractItemView::NoSelection 不可选择
  • QAbstractItemView::SingleSelection 单行选择,一次只允许选择一行
  • QAbstractItemView::MultiSelection 多行选择,鼠标单击就可以选择多行
  • QAbstractItemView::ExtendedSelection 扩展选择,按shift键选中一个范围内的行,ctrl键可以选中不相邻的行
  • QAbstractItemView::ContiguousSelection 相邻选择,按shift键或ctrl键都可以选中一个范围内的行

常用信号

//单元格被点击
[signal] void QTableWidget::itemClicked(QTableWidgetItem *item)

举例

显示当前行

 尾部添加一行

选中行前面插入一行

删除选中行

修改选中行

外观设置

选择模式设置

代码

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTableWidget>
#include<QHeaderView>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QGridLayout>
#include<QGroupBox>
#include<QLineEdit>
#include<QPushButton>
#include<QLabel>
#include<QCheckBox>
#include<QRadioButton>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr): QWidget(parent){resize(800,500);QHBoxLayout* main_layout=new QHBoxLayout(this);/*************************初始化表格控件*******************************///创建表格,并初始化数据table=new QTableWidget(this);//设置为4列table->setColumnCount(4);//设置列宽自适应table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//添加行表头table->setHorizontalHeaderLabels({"姓名","性别","年龄","籍贯"});//初始化2行数据//要先设置行数,来开辟空间table->setRowCount(2);//要先构造出列表项QTableWidgetItem* name1=new QTableWidgetItem("李雷");QTableWidgetItem* gender1=new QTableWidgetItem("男");QTableWidgetItem* age1=new QTableWidgetItem("12");QTableWidgetItem* province1=new QTableWidgetItem("广东");//设置居中对齐name1->setTextAlignment(Qt::AlignCenter);gender1->setTextAlignment(Qt::AlignCenter);age1->setTextAlignment(Qt::AlignCenter);province1->setTextAlignment(Qt::AlignCenter);//然后填充单元格数据table->setItem(0,0,name1);table->setItem(0,1,gender1);table->setItem(0,2,age1);table->setItem(0,3,province1);/********************************************************/QTableWidgetItem* name2=new QTableWidgetItem("韩梅梅");QTableWidgetItem* gender2=new QTableWidgetItem("女");QTableWidgetItem* age2=new QTableWidgetItem("11");QTableWidgetItem* province2=new QTableWidgetItem("北京");name2->setTextAlignment(Qt::AlignCenter);gender2->setTextAlignment(Qt::AlignCenter);age2->setTextAlignment(Qt::AlignCenter);province2->setTextAlignment(Qt::AlignCenter);table->setItem(1,0,name2);table->setItem(1,1,gender2);table->setItem(1,2,age2);table->setItem(1,3,province2);main_layout->addWidget(table);//初始化右边QWidget* right=new QWidget(this);main_layout->addWidget(right);right->setFixedWidth(300);QVBoxLayout* right_layout=new QVBoxLayout(right);//数据操作部分QGroupBox* group_box=new QGroupBox(this);group_box->setTitle("数据操作");right_layout->addWidget(group_box);QGridLayout* group_box_layout=new QGridLayout(group_box);name=new QLabel("姓名",this);name_edit=new QLineEdit(this);add=new QPushButton("添加一行",this);group_box_layout->addWidget(name,0,0);group_box_layout->addWidget(name_edit,0,1);group_box_layout->addWidget(add,0,2);gender=new QLabel("性别",this);gender_edit=new QLineEdit(this);insert=new QPushButton("插入一行",this);group_box_layout->addWidget(gender,1,0);group_box_layout->addWidget(gender_edit,1,1);group_box_layout->addWidget(insert,1,2);age=new QLabel("年龄",this);age_edit=new QLineEdit(this);del=new QPushButton("删除选中行",this);group_box_layout->addWidget(age,2,0);group_box_layout->addWidget(age_edit,2,1);group_box_layout->addWidget(del,2,2);province=new QLabel("籍贯",this);province_edit=new QLineEdit(this);mod=new QPushButton("修改选中行",this);group_box_layout->addWidget(province,3,0);group_box_layout->addWidget(province_edit,3,1);group_box_layout->addWidget(mod,3,2);group_box_layout->setVerticalSpacing(20);QHBoxLayout* layout_1=new QHBoxLayout();right_layout->addLayout(layout_1);QGroupBox* outlooking_setting=new QGroupBox(this);outlooking_setting->setTitle("外观设置");QVBoxLayout* layout_2=new QVBoxLayout(outlooking_setting);layout_1->addWidget(outlooking_setting);QCheckBox* row_head=new QCheckBox("行表头",this);QCheckBox* col_head=new QCheckBox("列表头",this);QCheckBox* alter_back_color=new QCheckBox("交替背景色",this);QCheckBox* editable=new QCheckBox("单元格可编辑",this);QCheckBox* style_sheet=new QCheckBox("设置样式表",this);layout_2->addWidget(row_head);layout_2->addWidget(col_head);layout_2->addWidget(alter_back_color);layout_2->addWidget(editable);layout_2->addWidget(style_sheet);//初始化复选框的选中状态row_head->setChecked(table->horizontalHeader()->isHidden()?false:true);col_head->setChecked(table->verticalHeader()->isHidden()?false:true);alter_back_color->setChecked(table->alternatingRowColors()?true:false);//如果为NoEditTriggers则表示单元格不可编辑editable->setChecked(table->editTriggers()==QAbstractItemView::NoEditTriggers?false:true);QGroupBox* select_setting=new QGroupBox(this);select_setting->setTitle("选择设置");layout_1->addWidget(select_setting);QVBoxLayout* layout_3=new QVBoxLayout(select_setting);QRadioButton* select_single=new QRadioButton("选择单元格",this);QRadioButton* select_one_row=new QRadioButton("选择行",this);layout_3->addWidget(select_single);layout_3->addWidget(select_one_row);//初始化单选按钮的选中状态int select_mode=table->selectionBehavior();if(select_mode==QAbstractItemView::SelectItems){select_single->setChecked(true);}else if(select_mode==QAbstractItemView::SelectRows){select_one_row->setChecked(true);}//将当前选中的行显示到编辑框中//绑定QTableWidget的itemClicked信号connect(table,&QTableWidget::itemClicked,this,[=](QTableWidgetItem* item){//获取到当前选中的行,下面两种方法都可//int cur_row=table->currentRow();int cur_row=item->row();//获取当前行中每一个itemname_edit->setText(table->item(cur_row,0)->text());gender_edit->setText(table->item(cur_row,1)->text());age_edit->setText(table->item(cur_row,2)->text());province_edit->setText(table->item(cur_row,3)->text());});//尾部添加一行connect(add,&QPushButton::clicked,this,[=](){//在添加之前,我们要先获取行数,把行数+1,开辟空间//如果添加n行,那么要先把行数+nint row=table->rowCount();table->setRowCount(row+1);QTableWidgetItem* name_item=new QTableWidgetItem(name_edit->text());QTableWidgetItem* gender_item=new QTableWidgetItem(gender_edit->text());QTableWidgetItem* age_item=new QTableWidgetItem(age_edit->text());QTableWidgetItem* province_item=new QTableWidgetItem(province_edit->text());//设置居中对齐name_item->setTextAlignment(Qt::AlignCenter);gender_item->setTextAlignment(Qt::AlignCenter);age_item->setTextAlignment(Qt::AlignCenter);province_item->setTextAlignment(Qt::AlignCenter);//行数的索引是从0开始的,所以新增行的索引就是row//填充单元格数据table->setItem(row,0,name_item);table->setItem(row,1,gender_item);table->setItem(row,2,age_item);table->setItem(row,3,province_item);});//当前行之前插入一行connect(insert,&QPushButton::clicked,this,[=](){//获取所有选中项auto select_items=table->selectedItems();if(select_items.empty()){//为空,证明没有选中return;}//只获取第一个选中项的行号int cur_row=select_items[0]->row();//在选中项前插入一行table->insertRow(cur_row);QTableWidgetItem* name_item=new QTableWidgetItem(name_edit->text());QTableWidgetItem* gender_item=new QTableWidgetItem(gender_edit->text());QTableWidgetItem* age_item=new QTableWidgetItem(age_edit->text());QTableWidgetItem* province_item=new QTableWidgetItem(province_edit->text());//设置居中对齐name_item->setTextAlignment(Qt::AlignCenter);gender_item->setTextAlignment(Qt::AlignCenter);age_item->setTextAlignment(Qt::AlignCenter);province_item->setTextAlignment(Qt::AlignCenter);//填充单元格数据table->setItem(cur_row,0,name_item);table->setItem(cur_row,1,gender_item);table->setItem(cur_row,2,age_item);table->setItem(cur_row,3,province_item);});//删除选中行connect(del,&QPushButton::clicked,this,[=](){//获取所有选中项auto select_items=table->selectedItems();if(select_items.empty()){//为空,证明没有选中return;}//只获取第一个选中项的行号int cur_row=select_items[0]->row();//删除选中行table->removeRow(cur_row);});//修改选中行connect(mod,&QPushButton::clicked,this,[=](){//获取所有选中项auto select_items=table->selectedItems();if(select_items.empty()){//为空,证明没有选中return;}//只获取第一个选中项的行号int cur_row=select_items[0]->row();//修改单元格数据table->item(cur_row,0)->setText(name_edit->text());table->item(cur_row,1)->setText(gender_edit->text());table->item(cur_row,2)->setText(age_edit->text());table->item(cur_row,3)->setText(province_edit->text());});//是否显示行表头connect(row_head,&QCheckBox::clicked,this,[=](){if(row_head->isChecked()){//选中后显示行表头table->horizontalHeader()->show();}else{//未选中则隐藏行表头table->horizontalHeader()->hide();}});//是否显示列表头connect(col_head,&QCheckBox::clicked,this,[=](){if(col_head->isChecked()){table->verticalHeader()->show();}else{table->verticalHeader()->hide();}});//是否交替切换行背景色connect(alter_back_color,&QCheckBox::clicked,this,[=](){if(alter_back_color->isChecked()){//win11该接口失效table->setAlternatingRowColors(true);}else{table->setAlternatingRowColors(false);}});//单元格是否可编辑connect(editable,&QCheckBox::clicked,this,[=](){if(editable->isChecked()){//双击、选中后单击、选中后按F2键都可编辑单元格table->setEditTriggers(QAbstractItemView::DoubleClicked |QAbstractItemView::SelectedClicked |QAbstractItemView::EditKeyPressed);}else{table->setEditTriggers(QAbstractItemView::NoEditTriggers);}});//设置样式表connect(style_sheet,&QCheckBox::clicked,this,[=](){if(style_sheet->isChecked()){//单元格的样式QString cellStyle = R"(QTableView{text-align:center;background-color: rgba(255, 255, 255, 0);alternate-background-color:#e3edf9;font:14px "微软雅黑";color:#677483;gridline-color: #ccddf0;})";//行表头的样式const QString horizontalHeaderStyle = R"(QHeaderView::section {color: black;font:bold 14px "微软雅黑";text-align:center;height:32px;background-color: #d1dff0;border:1px solid #8faac9;border-left:none;})";//列表头的样式const QString verticalHeaderStyle = R"(QHeaderView::section {color: black;font:bold 14px "微软雅黑";width:60px;text-align:center;background-color: #d1dff0;border:1px solid #8faac9;border-left:none;})";table->setStyleSheet(cellStyle);table->horizontalHeader()->setStyleSheet(horizontalHeaderStyle);table->verticalHeader()->setStyleSheet(verticalHeaderStyle);}else{table->setStyleSheet("");table->horizontalHeader()->setStyleSheet("");table->verticalHeader()->setStyleSheet("");}});//设置鼠标点击时只选中单元格connect(select_single,&QRadioButton::clicked,this,[=](){if(select_single->isChecked()){table->setSelectionBehavior(QAbstractItemView::SelectItems);}});//设置鼠标点击时选中一整行connect(select_one_row,&QRadioButton::clicked,this,[=](){if(select_one_row->isChecked()){table->setSelectionBehavior(QAbstractItemView::SelectRows);}});}~Widget()=default;
private:QTableWidget* table;//数据操作QLabel* name;QLineEdit* name_edit;QPushButton* add;QLabel* gender;QLineEdit* gender_edit;QPushButton* insert;QLabel* age;QLineEdit* age_edit;QPushButton* del;QLabel* province;QLineEdit* province_edit;QPushButton* mod;};
#endif // WIDGET_H

 学习链接:https://github.com/0voice

 

相关文章:

表格控件QTableWidget

下面说一下表格的常用方法 行列数目、行表头、列表头 行表头&#xff1a;就是表格控件的第一行&#xff0c;用于设置每一列的标题 列表头&#xff1a;就是表格控件的第一列&#xff0c;用于设置每一行的标题&#xff0c;通常缺省则默认显示行号 设置和获取行列的数目 在添…...

LeetCode236题:二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的祖…...

虚谷中使用PL/SQL改变模式下所有表的大小写

一、将表名转换为小写 1、原理和思路 首先&#xff0c;我们需要查询出指定模式下的所有表名&#xff0c;在xugu中&#xff0c;数据字典dba_tables包含了当前库下的所有表信息&#xff0c;我们可以使用游标&#xff08;CURSOR&#xff09;来遍历这些表名。 2、代码示例如下&am…...

数据挖掘的基本步骤和流程解析:深入洞察与策略实施

一、引言 在数据时代的浪潮中&#xff0c;数据挖掘技术已成为企业洞察市场、优化运营和驱动创新的利器。 它融合了统计学、机器学习、数据库管理和人工智能等领域的先进技术&#xff0c;旨在从海量数据中 提取有价值的信息。 本文将深入探讨数据挖掘的六个基本步骤&#xff0c…...

BCJR算法——卷积码的最大后验译码

定义&#xff1a;输入序列为 其中每比特&#xff0c;同时相应的输出序列为 其中每一码字的长度为n&#xff0c;定义在i时刻的编码器的状态为&#xff0c;对于时刻里有 表示输出码字和卷积码第i时刻的输入和第i-1时刻的状态有关&#xff08;包括寄存器和输出部分&#xff09;&am…...

系统架构设计师论文《论SOA在企业集成架构设计中的应用》精选试读

论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service-OrientedArchitecture,SOA&#xff09;的新型企业应用集成技术&#xff0c;强调将企业和组织内部的资源和业务…...

ceph rgw 桶分片之reshard

Ceph RGW&#xff08;RADOS Gateway&#xff09;的 reshard 功能是用来动态调整对象存储的分片&#xff08;shard&#xff09;数量&#xff0c;从而优化性能和存储利用率。随着数据量的增加&#xff0c;初始的分片设置可能无法满足性能需求&#xff0c;因此 reshard 功能允许用…...

开放原子开源基金会网站上的开源项目Opns存在缓冲区溢出缺陷

最近在开放原子开源基金会网站上&#xff0c;看到一些开源项目&#xff0c;之前分析出华为的鸿蒙操作系统代码&#xff0c;没有发现有价值的安全漏洞。现在&#xff0c;下载上面的Onps开源网络协议栈&#xff0c;既然是通讯所使用的软件&#xff0c;其质量应该值得信任呢&#…...

未来前端发展方向:深度探索与技术前瞻

未来前端发展方向&#xff1a;深度探索与技术前瞻 在数字化浪潮席卷全球的今天&#xff0c;前端开发作为连接用户与数字世界的桥梁&#xff0c;其重要性不言而喻。随着技术的不断进步和市场的不断变化&#xff0c;前端开发领域正经历着前所未有的变革。今天&#xff0c;我们将深…...

前端工程规范-2:JS代码规范(Prettier + ESLint)

Prettier 和 ESLint 是两个在现代 JavaScript 开发中广泛使用的工具&#xff0c;它们结合起来可以提供以下作用和优势&#xff1a; 代码格式化和风格统一&#xff1a; Prettier 是一个代码格式化工具&#xff0c;能够自动化地处理代码的缩进、空格、换行等格式问题&#xff0c;…...

Tomcat为什么要打破双亲委派?怎么保证安全

Tomcat打破双亲委派模型的原因主要是为了解决Web应用程序中的类加载冲突问题&#xff0c;并提供更好的灵活性和可扩展性。在Java中&#xff0c;双亲委派模型是一种类加载机制&#xff0c;它确保了类加载的安全性和一致性&#xff0c;但在Web应用程序的场景下&#xff0c;它可能…...

【C++篇】启航——初识C++(下篇)

接上篇【C篇】启航——初识C&#xff08;上篇&#xff09; 目录 一、引用 1.引用的概念 2.引用的基本语法 3.引用的特点 3.1 别名 3.2 不占用额外内存 3.3 必须初始化 3.4 不能为 NULL 4.引用的使用 4.1 函数参数传递 4.2 返回值 4.3 常量引用 5.引用和指针的关…...

Elasticsearch快速入门

文章目录 Elasticsearch快速入门核心概念倒排索引基本使用索引操作创建索引类型映射[了解]数据类型[了解] 查看索引删除索引 文档操作添加文档修改文档删除文档查询文档准备数据主键查询精确查询匹配查询 Elasticsearch快速入门 核心概念 Elasticsearch是面向文档的&#xff…...

uniapp微信小程序遮罩层u-popup禁止底层穿透

添加 touchmove.prevent&#xff0c;遮罩层底部的页面就不会滑动了微信开发者工具不生效&#xff0c;真机生效 <u-popup :show"showEwm" close"closeEwm" mode"center" touchmove.prevent><view class"ewmshow"></vie…...

【RocketMQ】秒杀设计与实现

&#x1f3af; 导读&#xff1a;本文档详细探讨了高并发场景下的秒杀系统设计与优化策略&#xff0c;特别是如何在短时间内处理大量请求。文档分析了系统性能指标如QPS&#xff08;每秒查询率&#xff09;和TPS&#xff08;每秒事务数&#xff09;&#xff0c;并通过实例讲解了…...

高级架构师面试题

一、技术深度方面 微服务架构的核心概念和优势&#xff1a; • 核心概念&#xff1a;将一个大型的应用拆分为多个小型的、独立部署的服务&#xff0c;每个服务都围绕着特定的业务功能进行构建&#xff0c;服务之间通过轻量级的通信机制进行交互。 • 优势&#xff1a; • 独…...

phpstudy简易使用

注意&#xff0c;本文所述的操作步骤均建立在电脑上已经完成php环境变量的配置与vscode的安装之上 、...

ubuntu server 常用配置

这里写目录标题 0001 虚拟机静态IP0002 vim tab 4个空格0003 设置时区0004 网络端口查看端口开放端口 0005 修噶机主机名 0001 虚拟机静态IP win网络链接&#xff0c;IP地址&#xff1a;192.168.220.1 - NAT网关&#xff1a;192.168.220.2 - ubuntu静态IP设置&#xff1a; ca…...

[Day 82] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在風險控制中的應用案例 風險控制是企業管理中至關重要的一環&#xff0c;AI技術的引入為風險控制帶來了前所未有的自動化和智能化。無論是在金融、保險、製造業&#xff0c;還是網絡安全中&#xff0c;AI都能有效地分析和預測潛在風險。本文將探討AI在風險控制中的應用&…...

微信小程序map组件自定义气泡真机不显示

最近遇到一个需求需要使用uniapp的map自定义气泡 &#xff0c;做完之后发现在模拟器上好好的&#xff0c;ios真机不显示&#xff0c;安卓页数时好时不好的 一番查询发现是小程序的老问题了&#xff0c;网上的方法都试了也没能解决 后来看到有人说用nvue可以正常显示&#xff0c…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...