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

【C++ Qt】多元素控件(ListWidget、TableWidget、TreeWidget)


每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论​:
本章将通过代码示例详细介绍了Qt中QListWidget、QTableWidget和QTreeWidget三种多元素控件的使用方法与核心功能,涵盖列表的增删操作、表格的行列管理以及树形结构的节点处理。
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。

在这里插入图片描述

多元素控件

Qt 中提供的多元素控件有:

  1. QListWidget
  2. QListView(前两个表示列表结构)
    在这里插入图片描述
  3. QTableWidget
  4. QTableView(前两个表示表格结构)
    在这里插入图片描述
  5. QTreeWidget
  6. QTreeView(前两个表示树形结构)
    在这里插入图片描述

不难发现两种结构中有:xxWidget 和 xxView 之间的区别

  1. xxView 是更底层的实现
  2. xxWidget 是基于 xxView 封装起来的

例如:

  • QTableView 是基于 MVC 设计的控件
    • QTableView ⾃⾝不持有数据(不支持Model)。使⽤ QTableView 的时候需要⽤⼾创建⼀个 Model 对象 (⽐如 QStandardModel ),比较麻烦~
    • 并且把 Model 和 QTableView 关联起来. 后续修改 Model 中的数据就会影响 QTableView 的显⽰
    • 修改 QTableView 的显⽰也会影响到 Model 中的数据(双向绑定).
  • QTableWidget 则是 QTableView 的⼦类, 对 Model 进⾏了封装
    • 所以不需要⽤⼾⼿动创建 Model 对象, 直接就可以往 QTableWidget 中添加数据了
    • 提供了更方便的 api 让自己使用

不能说谁好谁坏,不同场景使用不同:

  1. 其中 xxxWidget 使用起来比较方便,但功能有限
  2. 而 xxxView 使用起来比较麻烦,但可以自由diy,实现更复杂的功能

因为他们是两两一组的,所以此处就着重讲解Widget


List Widget 多元素控件 列表

使⽤ QListWidget 能够显⽰⼀个纵向的列表. 形如:
在这里插入图片描述
核⼼属性

属性说明
currentRow当前被选中的是第⼏⾏
count⼀共有多少⾏
sortingEnabled是否允许排序
isWrapping是否允许换⾏
itemAlignment元素的对⻬⽅式
selectRectVisible被选中的元素矩形(高亮)是否可⻅
spacing元素之间的间隔

核⼼⽅法

⽅法说明
addItem(const QString& label)
addItem(QListWidgetItem *item)
列表中添加元素(列表中的每个元素/每一项就成为一个item(通过QListWidgetItem 类表示))
currentItem()返回 QListWidgetItem* 表⽰当前选中的元素
setCurrentItem(QListWidgetItem* item)设置选中哪个元素
setCurrentRow(int row)设置选中第⼏⾏的元素
insertItem(const QString& label, int row)
insertItem(QListWidgetItem *item, int row)
在指定的位置插⼊元素 (此处的 row 参数就表示插入完毕之后新的元素在第几行,也就是把新元素插入到第几行之前)
item(int row)返回 QListWidgetItem* 表⽰第 row ⾏的元素
takeItem(int row)删除指定⾏的元素, 返回 QListWidgetItem* 表⽰是哪个元素被删除了

核⼼信号

⽅法说明
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old)选中不同元素时会触发. 参数是当前选中的元素和之前选中的元素.
currentRowChanged(int)选中不同元素时会触发. 参数是当前选中元素的⾏数.
itemClicked(QListWidgetItem* item)点击某个元素时触发
itemDoubleClicked(QListWidgetItem* item)双击某个元素时触发
itemEntered(QListWidgetItem* item)⿏标进⼊元素时触发

当选错了多元素控件的时候,可以通过右键选择 “变型为” 进行修改:
在这里插入图片描述

实操:ListWidget的新增删除列表

在这里插入图片描述

  1. 初始化默认的值

    1. 直接在构造函数中
      1. 通过列表控件调用addItem接口
      2. 添加:C++、Java、Python 子元素
    2. 也能直接在图形化界面中的右击 “列表控件” 选择 “编辑项目” 进行添加
      在这里插入图片描述
  2. 给新增按钮添加点击信号的槽函数:

    1. 获取到输入框中的内容
    2. 将获取到的内容 添加到QListWidget中
  3. 给删除按钮添加点击信号的槽函数:

    1. 获取被选元素它的行号(currentRow)
    2. 按行号进行删除元素 takeitem
  4. 右键列表新增 currentItemChanged 信号的槽函数(需要添加头文件 QListWidgetItem):

    1. 通过这个槽函数感知变化
    2. 判断current是否为空,不为空则打印:当前选中元素的文本
    3. 并且判断 previous 不为空的话也进行打印文本

结果:
在这里插入图片描述

源码:

#include "widget.h"
#include "ui_widget.h"#include <QListWidget>
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加子元素 addItemui->listWidget->addItem("C++");ui->listWidget->addItem("Java");ui->listWidget->addItem("Python");
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//获取label内部的数据QString text = ui->lineEdit->text();//添加到list中ui->listWidget->addItem(text);
}void Widget::on_pushButton_2_clicked()
{//获取鼠标选中的行号int row = ui->listWidget->currentRow();//删除行号的内容 takeitemui->listWidget->takeItem(row);
}void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{if(previous != nullptr){qDebug() << "previous: "<< previous->text();}//current 表示当前选中的元素、previous表示选中这个元素之前选择的元素if(current != nullptr){qDebug() << "current: "<< current->text();}}

Table Widget

使⽤ QTableWidget 表⽰⼀个表格控件. ⼀个表格中包含若⼲⾏, 每⼀⾏⼜包含若⼲列. 表格中的每个单元格, 是⼀个 QTableWidgetItem 对象

QTableWidget 核⼼⽅法

⽅法说明
item(int row, int column)根据⾏数列数获取指定的 QTableWidgetItem*
setItem(int row, int column, QTableWidget*)根据⾏数列数设置表格中的元素
currentItem()返回被选中的元素 QTableWidgetItem*
currentRow()返回被选中元素是第⼏⾏
currentColumn()返回被选中元素是第⼏列
row(QTableWidgetItem* )获取指定 item 是第⼏⾏
column(QTableWidgetItem* )获取指定 item 是第⼏列
rowCount()获取⾏数
columnCount()获取列数
insertRow(int row)在第 row ⾏处插⼊新⾏
insertColumn(int column)在第 column 列插⼊新列
removeRow(int row)删除第 row ⾏
removeColumn(int column)删除第 column 列
setHorizontalHeaderItem(int column, QTableWidget*)设置指定列的表头
setVerticalHeaderItem(int row, QTableWidget*)设置指定⾏的表头

QTableWidgetItem 核⼼信号

信号说明
cellClicked(int row, int column)点击单元格时触发
cellDoubleClicked(int row, int column)双击单元格时触发
cellEntered(int row, int column)⿏标进⼊单元格时触发
currentCellChanged(int row, int column, int previousRow, int previousColumn)选中不同单元格时触发

QTableWidgetItem 核⼼方法

⽅法说明
row()获取当前是第⼏⾏
column()获取当前是第⼏列
setText(const QString&)设置⽂本
setTextAlignment(int)设置⽂本对⻬
setIcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺⼨
setFont(const QFont&)设置字体

实操:简单实现表格增加行/列,添加元素

在这里插入图片描述

  1. 使用ui构建,如上图

  2. 编辑框初始化:

    1. 新增列:学号、姓名、年龄
    2. 新增行:1、2、3
    3. 1 张三 20、…
  3. 代码初始化:

    1. 创建三行(insertRow
    2. 创建三列(insertColumn
    3. 给3个列设定列名:setHeorizontalHeaderItem
    4. 给表格中添加数据 setItem(行,列,QTableWidgetItem(数据))

初始化的值:
在这里插入图片描述

给按钮添加槽函数:

  1. 给新增一行按钮添加槽函数
    1. 获取多少行 rowCount
    2. 在最后一行之后新增新行 insertRow(rowCount)(注意此处是下标,表示你新增之后的这是第几行)
  2. 删除选中行
    1. 获取选中的行号 currentRow
    2. 删除这一行 removeRow
  3. 新增行
    1. 获取有几列 columnCount
    2. 新增一列 insertColumn
    3. 设置列名(从输入框中获取)
      1. 获取输入框的文本
      2. 给新增行添加列名 setHorizontalHeaderItem
  4. 删除选中列
    1. 获取选中列号 currentColumn
    2. 删除这一列 removeColumn

在这里插入图片描述

源码:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//新增行ui->tableWidget_2->insertRow(0);//默认的即可不用设置行名称ui->tableWidget_2->insertRow(1);ui->tableWidget_2->insertRow(2);//新增列ui->tableWidget_2->insertColumn(0);ui->tableWidget_2->setHorizontalHeaderItem(0,new QTableWidgetItem("学号"));ui->tableWidget_2->insertColumn(1);ui->tableWidget_2->setHorizontalHeaderItem(1,new QTableWidgetItem("姓名"));ui->tableWidget_2->insertColumn(2);ui->tableWidget_2->setHorizontalHeaderItem(2,new QTableWidgetItem("年龄"));//添加数据ui->tableWidget_2->setItem(0,0,new QTableWidgetItem("1"));ui->tableWidget_2->setItem(0,1,new QTableWidgetItem("张三"));ui->tableWidget_2->setItem(0,2,new QTableWidgetItem("20"));ui->tableWidget_2->setItem(1,0,new QTableWidgetItem("2"));ui->tableWidget_2->setItem(1,1,new QTableWidgetItem("李四"));ui->tableWidget_2->setItem(1,2,new QTableWidgetItem("28"));ui->tableWidget_2->setItem(2,0,new QTableWidgetItem("3"));ui->tableWidget_2->setItem(2,1,new QTableWidgetItem("王五"));ui->tableWidget_2->setItem(2,2,new QTableWidgetItem("88"));}Widget::~Widget()
{delete ui;
}//新增一列
void Widget::on_pushButton_clicked()
{//获取LineEdit中的文本QString text = ui->lineEdit->text();//获取当前列数int ccount = ui->tableWidget->columnCount();//添加新列ui->tableWidget->insertColumn(ccount);//添加的是下标,所以刚好和个数相同//添加列名称if(text != nullptr){ui->tableWidget->setHorizontalHeaderItem(ccount,new QTableWidgetItem(text));}
}//删除选择的列
void Widget::on_pushButton_2_clicked()
{//获取光标选中的列int ccolumn = ui->tableWidget->currentColumn();//删除ui->tableWidget->removeColumn(ccolumn);
}//新增一行
void Widget::on_pushButton_3_clicked()
{//获取LineEdit中的文本QString text = ui->lineEdit->text();//获取当前行数int rcount = ui->tableWidget->rowCount();//添加新行ui->tableWidget->insertRow(rcount);//添加的是下标,所以刚好和个数相同//添加行名称if(text != ""){ui->tableWidget->setVerticalHeaderItem(rcount,new QTableWidgetItem(text));}
}//删除选中的行
void Widget::on_pushButton_4_clicked()
{//获取光标选中的行int crow = ui->tableWidget->currentRow();//删除行ui->tableWidget->removeRow(crow);
}

Tree Widget

使⽤ QTreeWidget 表⽰⼀个树形控件。⾥⾯的每个元素, 都是⼀个 QTreeWidgetItem ,每个
QTreeWidgetItem 可以包含多个⽂本和图标,每个⽂本/图标为⼀个 列
。可以给 QTreeWidget 设置顶层节点(顶层节点可以有多个), 然后再给顶层节点添加⼦节点, 从⽽构成树形结构。

对于列数的使用,可以对某子元素进行数据的展示,例如下图的 猫2 列,可以改成猫的年龄/体重,来描述当前子元素的各种属性数据
在这里插入图片描述
在这里插入图片描述

QTreeWidget 的 核⼼⽅法(顶层结点的方法

⽅法说明
clear清空所有⼦节点
addTopLevelItem(QTreeWidgetItem* item)新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点.
topLevelItemCount()获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item)查询指定节点是顶层节点中的下标
takeTopLevelItem(int index)删除指定的顶层节点. 返回 QTreeWidgetItem* 表⽰被删除的元素
currentItem()获取到当前选中的节点, 返回 QTreeWidgetItem*
setCurrentItem(QTreeWidgetItem* item)选中指定节点
setExpanded(bool)控制 展开/关闭 子节点
setHeaderLabel(const QString& text)设置 TreeWidget 的 header 名称

其中QTreeWidget控件虽然是树形结构,但是这个树形结构没有根节点,是从根结点的下一层结点开始计算的(如下图),所以是新增顶层结点
在这里插入图片描述

QTreeWidget 核⼼信号

信号说明
currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* old)切换选中元素时触发
itemClicked(QTreeWidgetItem* item, int col)点击元素时触发
itemDoubleClicked(QTreeWidgetItem* item, int col)双击元素时触发
itemEntered(QTreeWidgetItem* item, int col)⿏标进⼊时触发
itemExpanded(QTreeWidgetItem* item)元素被展开时触发
itemCollapsend(QTreeWidgetItem* item)元素被折叠时触发

QTreeWidgetItem 核⼼属性

属性说明
text持有的⽂本
textAlignment⽂本对⻬⽅式
icon持有的图表
font⽂本字体
hidden是否隐藏
disabled是否禁⽤
expand是否展开
sizeHint尺⼨⼤⼩
selected是否选中

QTreeWidgetItem 核⼼⽅法(子节点的方法

⽅法说明
addChild(QTreeWidgetItem* child)新增⼦节点
childCount()⼦节点的个数
child(int index)获取指定下标的⼦节点. 返回 QTreeWidgetItem*
takeChild(int index)删除对应下标的⼦节点
removeChild(QTreeWidgetItem* child)删除对应的⼦节点
parent()获取该元素的⽗节点

实操:理解顶层元素和子元素的添加删除

通过界面编辑快速填充初始值
在这里插入图片描述

代码操作:

  1. 拖拽一个treeWidget
  2. 设置根节点的名字 setHeaderLabel
  3. 新增顶层结点
    1. 创建 QTreeWidgetItem 结点对象
    2. 每个结点都可以设置多个列名称 setText(列数(从0开始),名称猫、狗、鸟)
    3. 添加到顶层结点中,addTopLevelItem
  4. 再添加的子节点
    1. 写创建 结点对象,设置名称(列数,中华田园猫、布偶猫、…)
    2. 添加到item1中的子节点 addChild

在这里插入图片描述

三个按钮的槽函数

  1. 插入顶层结点按钮添加点击信号的槽函数
    1. 获取输入框中的内容
    2. 构造一个节点对象,设置名称 setText 将获取到的内容给到
    3. 添加到顶层结点中
  2. 插入子节点
    1. 获取当前选中节点对象 currentItem(若为空则啥也不做返回…)
    2. 获取输入框中的内容
    3. 构造一个节点对象,
    4. 设置名称 setText 将获取到的内容给到(同上12不变)
    5. 插入到选中结点的子节点中
  3. 删除选中的元素
    1. 获取选中元素
    2. 非空则删除选中元素,需要先获取父元素,通过父元素进行删除 parent
    3. 若为空则代表为顶层元素
      1. 获取顶层元素下标 indexOfTopLevelItem
      2. 从控件中删除顶层结点,takeTopLevelItem
    4. 非空则为普通元素,则通过获取的获取的parent删除子结点 removeChild

结果:
在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"
#include <QTreeWidgetItem>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置根节点名称ui->treeWidget->setHeaderLabel("1");//创建结点对象QTreeWidgetItem* item1 = new QTreeWidgetItem();item1->setText(0,"猫");ui->treeWidget->addTopLevelItem(item1);//给顶层元素添加子元素QTreeWidgetItem* citem1 = new QTreeWidgetItem();citem1->setText(0,"狸花猫");item1->addChild(citem1);//就不多添加了...QTreeWidgetItem* item2 = new QTreeWidgetItem();item2->setText(0, "狗");ui->treeWidget->addTopLevelItem(item2);QTreeWidgetItem* item3 = new QTreeWidgetItem();item3->setText(0, "⻦");ui->treeWidget->addTopLevelItem(item3);
}Widget::~Widget()
{delete ui;
}//添加顶层元素
void Widget::on_pushButton_clicked()
{//获取输入框内容QString text = ui->lineEdit->text();if(text == QString()){text = "默认值...";}//将内容创建项目QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0,text);//添加到顶层ui->treeWidget->addTopLevelItem(item);
}//添加选中的子元素
void Widget::on_pushButton_2_clicked()
{//获取当前选中的顶层元素QTreeWidgetItem* item = ui->treeWidget->currentItem();if(item == nullptr) return ;//获取输入框内容QString text = ui->lineEdit->text();if(text == QString()){text = "默认值...";}//将输入框内容添加到创建的新子元素中QTreeWidgetItem* citem = new QTreeWidgetItem();citem->setText(0,text);//给顶层添加新元素item->addChild(citem);
}//删除选中的节点
void Widget::on_pushButton_3_clicked()
{//获取当前选中的节点QTreeWidgetItem* item = ui->treeWidget->currentItem();//需要获取父元素,通过父元素进行删除QTreeWidgetItem* pitem = item->parent();//若为空则,此时已经是顶层元素if(pitem == nullptr){//获取指定节点的顶层元素的下标int index = ui->treeWidget->indexOfTopLevelItem(item);ui->treeWidget->takeTopLevelItem(index);}else{ //若不是则://通过获取的父元素,删除指定的子元素pitem->removeChild(item);}}

注意上述控件相关的操作,数据都是在内存中的,重新运行程序数据就没了


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量C++细致内容,早关注不迷路。

相关文章:

【C++ Qt】多元素控件(ListWidget、TableWidget、TreeWidget)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将通过代码示例详细介绍了Qt中QListWidget、QTableWidget和QTreeWidget三种多元素控件的使用方法与核心功能&#xff0c;涵盖列表的增删操作、表格…...

排序算法-冒泡排序

冒泡排序一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。 这个算法的名字由来是因为元素会经由交换慢…...

C++ 工具链与开发实践:构建安全、高效与创新的开发生态

引言 在 C 的技术演进中&#xff0c;工具链的革新与开发实践的迭代始终是推动语言生命力的核心动力。从内存安全的攻防体系到嵌入式设备的能效优化&#xff0c;从跨平台开发的降本增效到开发者社区的生态构建&#xff0c;C 正通过工具链与方法论的双重升级&#xff0c;应对复杂…...

uni-pages-hot-modules插件:uni-app的pages.json的模块化及模块热重载

uni-pages-hot-modules uni-app的pages.json的模块化及模块热重载 uni-app的pages.json的模块化及模块热重载 解决uni-app的pages.json无法模块化的问题,并且解决模块热重载和缓存的问题 安装 npm i uni-pages-hot-modules -Suni-app vite版本(vue3)示例项目 uni-app webpa…...

【WEB3】区块链、隐私计算、AI和Web3.0——数据民主化(1)

区块链、隐私计算、AI&#xff0c;是未来Web3.0至关重要的三项技术。 1.数据民主化问题 数据在整个生命周期&#xff08;生产、传输、处理、存储&#xff09;内的隐私安全&#xff0c;则是Web3.0在初始阶段首要解决的问题。 数据民主化旨在打破数据垄断&#xff0c;让个体能…...

从0到1:用Lask/Django框架搭建个人博客系统(4/10)

摘要&#xff1a;本文深入解析了使用Lask和Django构建个人博客系统的全过程。从技术选型的考量&#xff0c;突出Lask的轻量灵活与Django的强大功能&#xff0c;到开发环境搭建、项目初始化&#xff0c;再到核心功能实现如文章管理、用户认证与权限控制&#xff0c;详细阐述了开…...

探索 C++23 的 views::cartesian_product

文章目录 一、背景与动机二、基本概念与语法三、使用示例四、特点与优势五、性能与优化六、与 P2374R4 的关系七、编译器支持八、总结 C23 为我们带来了一系列令人兴奋的新特性&#xff0c;其中 views::cartesian_product 是一个非常实用且强大的功能&#xff0c;它允许我们轻…...

微软拼音自定义词库方法

1.准备文件input.txt 令狐冲 郭靖2.使用python转成微软拼音需要的格式 from xpinyin import Pinyin # pip install xpinyin -i https://pypi.tuna.tsinghua.edu.cn/simplep Pinyin()with open(input.txt, r, encodingutf-8) as infile:with open(output.txt, w, encodingutf…...

SQLite3常用语句汇总

SQLite 命令行工具&#xff08;sqlite3 shell&#xff09; 中的内置命令 命令作用说明.open filename.db打开或创建一个 SQLite 数据库文件.tables列出当前数据库中的所有表.schema [table]查看某个表或所有表的建表语句&#xff08;DDL&#xff09;.headers ON/OFF开启或关闭…...

数据库设计三范式

第一范式 (1NF) 每个表中的每一列都是原子值 每个表中的每一行都是唯一的 下面这个表格就是不符合第一范式的例子&#xff1a;因为学时数能够拆分为讲课和实验。所以他并不是每一列都是原子值。 不仅要考虑列是否是原子值&#xff0c;还需要考虑每列的值是否可拆分。 第二范…...

GoWeb开发

学习目标&#xff1a; 本篇要达到的目的&#xff0c;能为后续复习提供极大便利。 &#xff08;当我写下本篇博客时&#xff0c;已复习3遍&#xff09; 一、网络通信概述 &#xff08;为本篇基础核心内容&#xff09; 1、什么是网络通信&#xff1f; 网络通信是指不同设备&…...

(7)Nokov 室内光学跟踪系统

文章目录 前言 7.1 所需硬件 7.2 Nokov 系统设置 7.3 配置旋翼机 7.4 启动 Nokov 模块 7.5 MAVProxy 准备 7.6 测试飞行 7.7 参数说明 前言 本文将介绍如何通过 Nokov 运动捕捉系统向旋翼机传输姿势信息。联系方式&#xff1a;NOKOV | Optical Motion Capture System。…...

Linux Shell编程和循环语句

一.for循环语句 1.for语句的结构2.for循环语句实例①根据姓名列表来批量创建多个用户②根据IP地址列表检查主机状态 二.使用while循环语句1.while语句结构2.while循环语句应用①批量添加规律编号用户②猜价格游戏 三 until循环语句1.until语句结构① 计算1-50的和 1.for语句的结…...

Java后端程序员学习前端之JavaScript

1.什么是JavaScript 1.1.概述 JavaScript是一门世界上最流行的脚本语言javaScript 一个合格的后端人员&#xff0c;必须要精通JavaScript 1.2.历史 JavaScript的起源故事-CSDN博客 2.快速入门 2.1.引入JavaScript 1.内部标签 <script>//.......</script> --…...

redis多路复用IO模型 以及 6.0引入的多线程模型

redis为什么选择单线程 采用多线程的话&#xff0c;会出现上下文切换的开销采用多线程&#xff0c;会带来共享资源的竞争控制&#xff0c;比如多个线程同时访问同一个资源&#xff08;键值&#xff09;时&#xff0c;需要额外的手段来保障共享资源的正确性&#xff0c;会带来额…...

101alpha_第6个

第6个alpha (-1 * correlation(open, volume, 10)) 这个就是看这两个相似性。10天之内的 如果结果为正且数值较大&#xff0c;投资者可能会认为在开盘价上涨时成交量萎缩&#xff0c;市场上涨动力不足&#xff0c;可能是卖出信号&#xff1b;反之&#xff0c;开盘价下跌时成交…...

crawl4ai能替代scrapy等传统爬虫框架吗?

传统爬虫框架就像拿着渔网在数字海洋中捕鱼——虽然能捞到东西&#xff0c;但面对现代网站的复杂性时常常"漏网之鱼"满天飞。以Scrapy为代表的工具存在三大致命短板&#xff1a;首先是JavaScript盲区&#xff0c;对动态渲染内容束手无策&#xff0c;就像试图用收音机…...

Sui Basecamp 2025 全栈出击

“我们不仅仅是在构建一个 L1&#xff0c;我们是在重建互联网。” — — Mysten Labs 首席产品官 Adeniyi Abiodun 本届 Sui Basecamp 汇聚了 Web3 领域的建设者、合作伙伴和思想领袖&#xff0c;为期两天&#xff0c;不仅展示了 Sui 的未来&#xff0c;也展现了去中心化互联网…...

计算机体系架构-----设计模式:状态模式(从程序员加班问题切入)

文章目录 1.梦开始的地方2.代码1.0版本3.代码2.0版本4.代码3.0版本5.梦结束的地方 最近在学习这个专业课里面的体系结构这门课程&#xff0c;作为专业里面的一门基础课&#xff0c;这个课程里面主要讲解的就是软件的设计思想&#xff0c;一些历程之类的&#xff0c;包括了面向对…...

【C/C++】RPC与线程间通信:高效设计的关键选择

文章目录 RPC与线程间通信&#xff1a;高效设计的关键选择1 RPC 的核心用途2 线程间通信的常规方法3 RPC 用于线程间通信的潜在意义4 主要缺点与限制4.1 缺点列表4.2 展开 5 替代方案6 结论 RPC与线程间通信&#xff1a;高效设计的关键选择 在C或分布式系统设计中&#xff0c;…...

数据结构之串

一、串的定义与基本概念 1. 串的定义 定义&#xff1a;串是由零个或多个字符组成的有限序列&#xff0c;记作 s"a1​a2​…an​"&#xff0c;例如 "data structure"、"123" 等。 空串&#xff1a;无任何字符&#xff0c;长度为 0&#xff0c;…...

基于腾讯云MCP广场的AI自动化实践:爬取小红书热门话题

基于腾讯云MCP广场的AI自动化实践&#xff1a;爬取小红书热门话题 我正在参加Trae「超级体验官」创意实践征文&#xff0c;本文所使用的 Trae 免费下载链接&#xff1a;www.trae.com.cn/?utm_source… &#x1f50e; 背景 在人工智能快速发展的时代&#xff0c;AI技术不仅重…...

AI领域的MCP(Model-Centric Paradigm)

1. 什么是MCP&#xff08;Model-Centric Paradigm&#xff09;&#xff1f; MCP&#xff08;Model-Centric Paradigm&#xff09;是人工智能开发中的一种核心理念&#xff0c;强调以模型的优化与改进作为主要驱动因素来提升AI系统的表现。在MCP模式下&#xff0c;开发者专注于…...

裸辞8年前端的面试笔记——JavaScript篇(一)

裸辞后的第二个月开始准备找工作&#xff0c;今天是第三天目前还没有面试&#xff0c;现在的行情是一言难尽&#xff0c;都在疯狂的压价。 下边是今天复习的个人笔记 一、事件循环 JavaScript 的事件循环&#xff08;Event Loop&#xff09;是其实现异步编程的关键机制。 从…...

力扣刷题Day 41:除自身以外数组的乘积(238)

1.题目描述 2.思路 方法1&#xff1a;搞一个数组存放各元素之前所有数的乘积&#xff08;头为1&#xff09;&#xff0c;再搞一个数组存放各元素之后所有数的乘积&#xff08;尾为1&#xff09;。 方法2&#xff1a;上面的方法是很好理解的&#xff0c;在此基础上应该如何优化…...

金仓数据库征文-金仓KES数据同步优化实践:逻辑解码与增量同步

目录 一.同步场景与方案选型 二.同步环境配置 1.前置条件验证 2.逻辑解码配置 三.同步实施与问题排查 1.结构映射规则 2.增量数据捕获 3.数据一致性校验 四.性能调优实践 1.同步线程优化 2.批量提交优化 3.资源监控指标 五.典型场景解决方案 1.双向同步冲突处理 …...

【前端基础】9、CSS的动态伪类(hover、visited、hover、active、focus)【注:本文只有几个粗略说明】

一、什么是伪类 选择器的一种&#xff0c;用于选择处于特定状态的元素。 最常见的现象&#xff1a;鼠标放在某些文字上面&#xff0c;文字就会加上颜色。 鼠标没放上去之前&#xff1a; 鼠标放上去之后&#xff1a; 二、动态伪类 图片来源&#xff08;链接文章也有其他伪…...

企业开发平台大变革:AI 代理 + 平台工程重构数字化转型路径

在企业数字化转型的浪潮中&#xff0c;开发平台正经历着前所未有的技术革命。从 AST&#xff08;抽象语法树&#xff09;到 AI 驱动的智能开发&#xff0c;从微服务架构到信创适配&#xff0c;这场变革不仅重塑了软件开发的底层逻辑&#xff0c;更催生了全新的生产力范式。本文…...

ZooKeeper工作机制与应用场景

目录 1.1、概述1.2、选举机制1.2.1、选举触发条件1.2.2、选举规则1.2.3、选举过程详解 1.3、数据同步机制1.3.1、正常同步1.3.2、宕机同步 1.4、客户端常用命令1.5、应用场景1.5.1、配置管理1.5.2、命令服务1.5.3、分布式锁服务1.5.4、集群管理1.5.5、分布式ID1.5.6、分布式协调…...

VR制作软件用途(VR制作软件概述)

虚拟现实&#xff08;VR&#xff09;制作软件作为现代科技的瑰宝&#xff0c;正以独特的魅力重塑各行各业。 通过构建三维虚拟环境&#xff0c;这些软件提供了前所未有的沉浸式体验&#xff0c;还推动了技术革新与产业升级。本文将探讨VR制作软件的主要用途&#xff0c;并重点…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.1 业务场景与数据准备

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 9.1 业务场景与数据准备9.1.1 业务场景描述核心业务目标业务挑战 9.1.2 数据来源与获取数据源构成数据获取方案 9.1.3 数据结构与字段说明核心数据表设计1. 订单事实表&…...

PyTorch 入门与核心概念详解:从基础到实战问题解决

PyTorch 入门与核心概念详解&#xff1a;从基础到实战问题解决 前言 用PyTorch 编写 Transformer 模型时遇到了多个错误&#xff0c;包括维度不匹配、NaN 损失、注意力权重未记录以及 OpenMP 库初始化等问题。 本文基于以上&#xff0c;对 PyTorch 的基本解释&#xff0c;并对…...

【办公类-99-05】20250508 D刊物JPG合并PDF便于打印

背景需求 委员让我打印2024年2025年4月的D刊杂志&#xff0c;A4彩打&#xff0c;单面。 有很多JPG&#xff0c;一个个JPG图片打开&#xff0c;实在太麻烦了。 我需要把多个jpg图片合并成成为一个PDF&#xff0c;按顺序排列打印。 deepseek写Python代码 代码展示 D刊jpg图片合…...

【C++】手搓一个STL风格的string容器

C string类的解析式高效实现 GitHub地址 有梦想的电信狗 1. 引言&#xff1a;字符串处理的复杂性 ​ 在C标准库中&#xff0c;string类作为最常用的容器之一&#xff0c;其内部实现复杂度远超表面认知。本文将通过一个简易仿照STL的string类的完整实现&#xff0c;揭示其设…...

无实体对话式社交机器人 拟人化印象形成机制:基于多模态交互与文化适配的拓展研究

《如何感知AI对话者:无实体对话式社交机器人拟人化对其印象形成效果影响机制的实验研究》解析 一、研究背景与核心问题 (一)技术背景与研究动机 随着生成式AI技术发展,以ChatGPT、文心一言为代表的无实体对话式社交机器人兴起,用户对其高度拟人化特征有显著需求,如扮演…...

存储器:DDR和独立显卡的GDDR有什么区别?

本文来简要对比DDR&#xff08;Double Data Rate SDRAM&#xff09;和GDDR&#xff08;Graphics Double Data Rate SDRAM&#xff09;的区别&#xff0c;重点说明它们在设计、性能和应用上的差异&#xff1a; 1. 设计目标与架构 DDR&#xff1a;通用型DRAM&#xff0c;设计为…...

viewDesign里的table内嵌套select动态添加表格行绑定内容丢失

问题 描述 viewDesign里的table内嵌套select&#xff0c;表格的行数是手动点击按钮添加的&#xff0c;添加第一行选择select的内容能正常展示&#xff0c;添加第二行第一行的select的内容消失 代码 <FormItem label"内饰颜色"><Tableclass"mt_10&q…...

vue v-html无法解析<

vue v-html无法解析字符串的小于号 方法一&#xff1a;可以替换成转义符 (实际还是会报错) let str 12345<445667 str.replaceAll(<, <)方法二&#xff1a;可以替换成中文小于号 let str 12345<445667 str.replaceAll(<, &#xff1c;)...

COLT_CMDB_linux_userInfo_20250508.sh修复历史脚本输出指标信息中userName与输出信息不一致问题

#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT SYSTEM_LINUX_AGENTUSERDISCOVER|discovery.user[disc] #原型指标 #IT_RULE SYSTEM_LINUX_AGENTUSERGROUPID|groupId[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERHOME|userHome[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERNAME|user…...

A. Row GCD(gcd的基本性质)

Problem - 1458A - Codeforces 思路&#xff1a; 首先得知道gcd的两个基本性质&#xff1a; (1) gcd(a,b)gcd(a,|b-a|) (2) gcd(a,b,c)gcd(a,gcd(b,c)) 结合题目所给的a1bj&#xff0c;a2bj...... anbj 根据第一条性质得到&#xff1a; gcd(a1bj&#xff0c;a2bj)gcd(…...

k8s术语之Horizontal Pod Autoscaling

应用的资源使用率通常都有高峰和低谷的时候&#xff0c;如何削峰填谷&#xff0c;提高整体的整体资源利用率&#xff0c;让service中的Pod个数自动调整呢&#xff1f;Horizontal Pod Autoscaling:使pod水平自动缩放。这个Object也是最能体现kubernetes之于传统运维价值的地方&a…...

函数级重构:如何写出高可读性的方法?

1. 引言:为什么方法级别的重构如此重要? 在软件开发中,方法(函数)是程序逻辑的基本单元。一个高质量的方法不仅决定了程序是否能正常运行,更直接影响到: 代码的可读性:能否让其他开发者快速理解可维护性:未来修改是否容易出错可测试性:是否便于编写单元测试协作效率…...

手撕基于AMQP协议的简易消息队列-8(单元测试的编写)

在MQTest中编写模块的单元测试 在MQTest中编写makefile文件来编译客户端模块 all:Test_FileHelper Test_Exchange Test_Queue Test_Binding Test_Message Test_VirtualHost Test_Route Test_Consumer Test_Channel Test_Connection Test_VirtualHost:Test_VirtualHost.cpp ..…...

硬件选型:工控机的选择要素

在机器视觉应用中&#xff0c;工控机作为核心计算设备&#xff0c;承担着图像处理、数据分析和设备控制等多重任务。由于机器视觉常常在工业自动化、质量检测和精密控制中发挥重要作用&#xff0c;工控机的选型直接影响系统的性能和可靠性。 1. 应用场景与需求 机器视觉系统广…...

【芯片设计- RTL 数字逻辑设计入门 4.1 -- verilog 组合逻辑和时序逻辑延时比较】

文章目录 Overview时间线简单示意Overview 我们来详细分析下面这段 RTL Code , sbcs_sbbusy 为什么会比 sbcs_sbbusy_nx 慢一拍(晚一个时钟周期变化)。 assign sbcs_sbbusy_nx = set_sbcs_sbbusy;always @(posedge clk or negedge dmi_resetn) beginif (!dmi_resetn) begi…...

关于ubuntu下交叉编译arrch64下的gtsam报错问题,boost中boost_regex.so中连接libicui18n.so.55报错的问题

交叉编译gtsam时遇到的报错信息如下&#xff1a;gtsam需要连接boost&#xff0c; 解决办法&#xff1a; 1.重新编译boost可解决。 2.自己搞定生成一个libicui18n.so.55。 由于我们的boost是公用的&#xff0c;因此1不太可能&#xff08;我试过重新编译完boost,在编译gtsam完…...

IoT平台和AIoT平台的区别

1. 什么是AIoT平台&#xff1f; AIoT&#xff08;人工智能物联网&#xff0c;Artificial Intelligence of Things&#xff09;平台 是 人工智能&#xff08;AI&#xff09; 与 物联网&#xff08;IoT&#xff09; 深度融合的技术框架&#xff0c;通过将AI算法嵌入物联网终端或…...

iOS 模块化开发流程

iOS模块化开发是一种将大型项目拆分为独立、可复用模块的开发模式&#xff0c;能够提升代码可维护性、团队协作效率和动态交付能力。以下是iOS模块化开发的核心流程与关键要点&#xff1a; 一、模块化设计阶段 业务解耦与模块划分 横向分层&#xff1a;基础层&#xff08;网络、…...

云原生安全治理体系建设全解:挑战、框架与落地路径

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:云原生环境下,安全治理正在被重构 在传统IT架构中,安全防护多依赖边界设备(如防火墙、WAF、堡垒机)进行集中式防护。然而,在云原生环境下,这种“边界式”安全模型正面临颠覆。 应用微服务化…...

如何在Vue-Cli中使用Element-UI和Echarts和swiper插件(低版本)

1st.Element-UI 1.1 安装 在终端输入 npm install element-ui 1.2 导入 在全局main.js中全局导入Element-UI&#xff1a; // 导入element-ui组件库 import ElementUI from element-ui; // 导入element-ui组件库的样式 import element-ui/lib/theme-chalk/index.css; // 注…...