当前位置: 首页 > 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…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...