表格控件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
下面说一下表格的常用方法 行列数目、行表头、列表头 行表头:就是表格控件的第一行,用于设置每一列的标题 列表头:就是表格控件的第一列,用于设置每一行的标题,通常缺省则默认显示行号 设置和获取行列的数目 在添…...
LeetCode236题:二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…...
虚谷中使用PL/SQL改变模式下所有表的大小写
一、将表名转换为小写 1、原理和思路 首先,我们需要查询出指定模式下的所有表名,在xugu中,数据字典dba_tables包含了当前库下的所有表信息,我们可以使用游标(CURSOR)来遍历这些表名。 2、代码示例如下&am…...
数据挖掘的基本步骤和流程解析:深入洞察与策略实施
一、引言 在数据时代的浪潮中,数据挖掘技术已成为企业洞察市场、优化运营和驱动创新的利器。 它融合了统计学、机器学习、数据库管理和人工智能等领域的先进技术,旨在从海量数据中 提取有价值的信息。 本文将深入探讨数据挖掘的六个基本步骤,…...
BCJR算法——卷积码的最大后验译码
定义:输入序列为 其中每比特,同时相应的输出序列为 其中每一码字的长度为n,定义在i时刻的编码器的状态为,对于时刻里有 表示输出码字和卷积码第i时刻的输入和第i-1时刻的状态有关(包括寄存器和输出部分)&am…...
系统架构设计师论文《论SOA在企业集成架构设计中的应用》精选试读
论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service-OrientedArchitecture,SOA)的新型企业应用集成技术,强调将企业和组织内部的资源和业务…...
ceph rgw 桶分片之reshard
Ceph RGW(RADOS Gateway)的 reshard 功能是用来动态调整对象存储的分片(shard)数量,从而优化性能和存储利用率。随着数据量的增加,初始的分片设置可能无法满足性能需求,因此 reshard 功能允许用…...
开放原子开源基金会网站上的开源项目Opns存在缓冲区溢出缺陷
最近在开放原子开源基金会网站上,看到一些开源项目,之前分析出华为的鸿蒙操作系统代码,没有发现有价值的安全漏洞。现在,下载上面的Onps开源网络协议栈,既然是通讯所使用的软件,其质量应该值得信任呢&#…...
未来前端发展方向:深度探索与技术前瞻
未来前端发展方向:深度探索与技术前瞻 在数字化浪潮席卷全球的今天,前端开发作为连接用户与数字世界的桥梁,其重要性不言而喻。随着技术的不断进步和市场的不断变化,前端开发领域正经历着前所未有的变革。今天,我们将深…...
前端工程规范-2:JS代码规范(Prettier + ESLint)
Prettier 和 ESLint 是两个在现代 JavaScript 开发中广泛使用的工具,它们结合起来可以提供以下作用和优势: 代码格式化和风格统一: Prettier 是一个代码格式化工具,能够自动化地处理代码的缩进、空格、换行等格式问题,…...
Tomcat为什么要打破双亲委派?怎么保证安全
Tomcat打破双亲委派模型的原因主要是为了解决Web应用程序中的类加载冲突问题,并提供更好的灵活性和可扩展性。在Java中,双亲委派模型是一种类加载机制,它确保了类加载的安全性和一致性,但在Web应用程序的场景下,它可能…...
【C++篇】启航——初识C++(下篇)
接上篇【C篇】启航——初识C(上篇) 目录 一、引用 1.引用的概念 2.引用的基本语法 3.引用的特点 3.1 别名 3.2 不占用额外内存 3.3 必须初始化 3.4 不能为 NULL 4.引用的使用 4.1 函数参数传递 4.2 返回值 4.3 常量引用 5.引用和指针的关…...
Elasticsearch快速入门
文章目录 Elasticsearch快速入门核心概念倒排索引基本使用索引操作创建索引类型映射[了解]数据类型[了解] 查看索引删除索引 文档操作添加文档修改文档删除文档查询文档准备数据主键查询精确查询匹配查询 Elasticsearch快速入门 核心概念 Elasticsearch是面向文档的ÿ…...
uniapp微信小程序遮罩层u-popup禁止底层穿透
添加 touchmove.prevent,遮罩层底部的页面就不会滑动了微信开发者工具不生效,真机生效 <u-popup :show"showEwm" close"closeEwm" mode"center" touchmove.prevent><view class"ewmshow"></vie…...
【RocketMQ】秒杀设计与实现
🎯 导读:本文档详细探讨了高并发场景下的秒杀系统设计与优化策略,特别是如何在短时间内处理大量请求。文档分析了系统性能指标如QPS(每秒查询率)和TPS(每秒事务数),并通过实例讲解了…...
高级架构师面试题
一、技术深度方面 微服务架构的核心概念和优势: • 核心概念:将一个大型的应用拆分为多个小型的、独立部署的服务,每个服务都围绕着特定的业务功能进行构建,服务之间通过轻量级的通信机制进行交互。 • 优势: • 独…...
phpstudy简易使用
注意,本文所述的操作步骤均建立在电脑上已经完成php环境变量的配置与vscode的安装之上 、...
ubuntu server 常用配置
这里写目录标题 0001 虚拟机静态IP0002 vim tab 4个空格0003 设置时区0004 网络端口查看端口开放端口 0005 修噶机主机名 0001 虚拟机静态IP win网络链接,IP地址:192.168.220.1 - NAT网关:192.168.220.2 - ubuntu静态IP设置: ca…...
[Day 82] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
AI在風險控制中的應用案例 風險控制是企業管理中至關重要的一環,AI技術的引入為風險控制帶來了前所未有的自動化和智能化。無論是在金融、保險、製造業,還是網絡安全中,AI都能有效地分析和預測潛在風險。本文將探討AI在風險控制中的應用&…...
微信小程序map组件自定义气泡真机不显示
最近遇到一个需求需要使用uniapp的map自定义气泡 ,做完之后发现在模拟器上好好的,ios真机不显示,安卓页数时好时不好的 一番查询发现是小程序的老问题了,网上的方法都试了也没能解决 后来看到有人说用nvue可以正常显示,…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
Vue 实例的数据对象详解
Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...
自定义线程池1.2
自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本,将线程池中的线程数量交给使用者决定,并且将线程的创建延迟到任务提交的时候,在本文中我们将对这个版本进行如下的优化: 在新建线程时交给线程一个任务。让线程在某种情况下…...
第14节 Node.js 全局对象
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。 在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局…...
Angular中Webpack与ngx-build-plus 浅学
Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具,用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中,Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...
【电路笔记】-变压器电压调节
变压器电压调节 文章目录 变压器电压调节1、概述2、变压器电压调节3、变压器电压调节示例14、变压器电压调节示例25、变压器电压调节示例36、总结变压器电压调节是变压器输出端电压因连接负载电流的变化而从其空载值向上或向下变化的比率或百分比值。 1、概述 电压调节是衡量变…...
django paramiko 跳转登录
在使用Django框架结合Paramiko进行SSH远程操作时,通常涉及到自动化脚本的执行,比如远程服务器上的命令执行、文件传输等。如果你的需求是“跳转登录”,即在登录远程服务器后,再通过该服务器的SSH连接跳转到另一台服务器࿰…...
