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

QT的Model-View实现大批量数据展示

一、完整源代码

1.项目结构

2.各文件代码展示

define.h

#pragma once
#include <QVector>//学生信息
typedef struct _STUDENT {QString name;   //姓名int score1;     //语文成绩int score2;     //数学成绩int score3;     //外语成绩_STUDENT(){name = "";score1 = score2 = score3 = 0;}
}STUDENT, *PSTUDENT;//班级信息
typedef struct _CLASS {QString name;   //班级QVector<STUDENT*> students;_CLASS(){name = "";}
}CLASS;

mainwindow.h

#pragma once#include <QtWidgets/QWidget>
#include "ui_mainwindow.h"
#include "define.h"class TreeModel;
class TreeItem;class MainWindow : public QWidget
{Q_OBJECTpublic:MainWindow(QWidget *parent = Q_NULLPTR);private slots:void on_btn1_clicked(); //QStandardItemModelvoid on_btn2_clicked(); //自定义modelvoid SlotItemSelect(const QModelIndex &modelIndex);void SlotAddItem();void SlotRightMenu(const QPoint &pos);void SlotTreeMenuDelete();private:Ui::MainWindowClass *ui;QVector<CLASS*> mClasses;   //模拟数据TreeModel *model;
};

mainwindow.cpp

#include "mainwindow.h"
#include "TreeItem.h"
#include "TreeModel.h"#include <QMenu>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QItemSelectionModel>MainWindow::MainWindow(QWidget *parent): QWidget(parent), ui(new Ui::MainWindowClass())
{ui->setupUi(this);//初始化模拟数据:学生成绩//10个班级、每个班级10000个学生,共10W行记录int nClass = 10;int nStudent = 100000;for (int i = 0; i < nClass; i++){CLASS* c = new CLASS;c->name = QString("class%1").arg(i);for (int j = 0; j < nStudent; j++){STUDENT* s = new STUDENT;s->name = QString("name%1").arg(j);s->score1 = s->score2 = s->score3 = (j % 10) * 10;c->students.append(s);}mClasses.append(c);}connect(ui->btn1, &QPushButton::clicked, this, &MainWindow::on_btn1_clicked);connect(ui->btn2, &QPushButton::clicked, this, &MainWindow::on_btn2_clicked);connect(ui->treeView, &QTreeView::clicked, this, &MainWindow::SlotItemSelect);connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::SlotAddItem);connect(ui->treeView, &QTreeView::customContextMenuRequested, this, &MainWindow::SlotRightMenu);ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
}void MainWindow::on_btn1_clicked()
{//1,QTreeView常用设置项QTreeView* t = ui->treeView;//    t->setEditTriggers(QTreeView::NoEditTriggers);			//单元格不能编辑t->setSelectionBehavior(QTreeView::SelectRows);			//一次选中整行t->setSelectionMode(QTreeView::SingleSelection);        //单选,配合上面的整行就是一次选单行
//    t->setAlternatingRowColors(true);                       //每间隔一行颜色不一样,当有qss时该属性无效t->setFocusPolicy(Qt::NoFocus);                         //去掉鼠标移到单元格上时的虚线框//2,列头相关设置t->header()->setHighlightSections(true);                //列头点击时字体变粗,去掉该效果t->header()->setDefaultAlignment(Qt::AlignCenter);      //列头文字默认居中对齐t->header()->setDefaultSectionSize(100);                //默认列宽100t->header()->setStretchLastSection(true);               //最后一列自适应宽度t->header()->setSortIndicator(0, Qt::AscendingOrder);    //按第1列升序排序//3,构造ModelQStringList headers;headers << QStringLiteral("班级/姓名")<< QStringLiteral("语文")<< QStringLiteral("数学")<< QStringLiteral("外语")<< QStringLiteral("总分")<< QStringLiteral("平均分")<< QStringLiteral("是否合格")<< QStringLiteral("是否评优");QStandardItemModel* model = new QStandardItemModel(ui->treeView);model->setHorizontalHeaderLabels(headers);foreach(CLASS* c, mClasses){QStandardItem *pItemClass = new QStandardItem(c->name);model->appendRow(pItemClass);foreach(STUDENT* s, c->students){//二级节点:学生信息int score1 = s->score1;int score2 = s->score2;int score3 = s->score3;int nTotal = score1 + score2 + score3;int nAverage = nTotal / 3;bool bPass = true;if (score1 < 60 || score2 < 60 || score3 < 60){//任意一门课不合格则不合格bPass = false;}bool bGood = false;if (score1 >= 90 && score2 >= 90 && score3 >= 90){//每门课都达到90分以上评优bGood = true;}QList<QStandardItem*> items;QStandardItem* item0 = new QStandardItem(s->name);QStandardItem* item1 = new QStandardItem(QString::number(score1));QStandardItem* item2 = new QStandardItem(QString::number(score2));QStandardItem* item3 = new QStandardItem(QString::number(score3));QStandardItem* item4 = new QStandardItem(QString::number(nTotal));QStandardItem* item5 = new QStandardItem(QString::number(nAverage));QStandardItem* item6 = new QStandardItem(bPass ? QStringLiteral("合格") : QStringLiteral("不合格"));QStandardItem* item7 = new QStandardItem(bGood ? QStringLiteral("优秀") : QStringLiteral("-"));items << item0 << item1 << item2 << item3 << item4 << item5 << item6 << item7;pItemClass->appendRow(items);}}t->setModel(model);
}void MainWindow::on_btn2_clicked()
{//1,QTreeView常用设置项QTreeView* t = ui->treeView;//    t->setEditTriggers(QTreeView::NoEditTriggers);			//单元格不能编辑t->setSelectionBehavior(QTreeView::SelectRows);			//一次选中整行t->setSelectionMode(QTreeView::SingleSelection);        //单选,配合上面的整行就是一次选单行
//    t->setAlternatingRowColors(true);                       //每间隔一行颜色不一样,当有qss时该属性无效t->setFocusPolicy(Qt::NoFocus);                         //去掉鼠标移到单元格上时的虚线框//2,列头相关设置t->header()->setHighlightSections(true);                //列头点击时字体变粗,去掉该效果t->header()->setDefaultAlignment(Qt::AlignCenter);      //列头文字默认居中对齐t->header()->setDefaultSectionSize(100);                //默认列宽100t->header()->setStretchLastSection(true);               //最后一列自适应宽度t->header()->setSortIndicator(0, Qt::AscendingOrder);    //按第1列升序排序//3,构造ModelQStringList headers;headers << QStringLiteral("班级/姓名")<< QStringLiteral("语文")<< QStringLiteral("数学")<< QStringLiteral("外语")<< QStringLiteral("总分")<< QStringLiteral("平均分")<< QStringLiteral("是否合格")<< QStringLiteral("是否评优");model = new TreeModel(headers, ui->treeView);TreeItem *pRootItem = model->root();foreach(CLASS* c, mClasses){TreeItem *pClass = new TreeItem(pRootItem);pClass->setLevel(1);pClass->setPtr(c);pRootItem->appendChild(pClass);foreach(STUDENT* s, c->students){TreeItem* itemStudent = new TreeItem(pClass);itemStudent->setLevel(2);   //设为一级节点,供显示时判断节点层级来转换数据指针类型itemStudent->setPtr(s);     //保存STUDENT* s为其数据指针,显示时从STUDENT*取内容显示pClass->appendChild(itemStudent);}}t->setModel(model);
}void MainWindow::SlotItemSelect(const QModelIndex &modelIndex)
{TreeItem *pItem = static_cast<TreeItem*>(modelIndex.internalPointer());QString strText = QString::number(pItem->level());strText += "\n" + QString::number(pItem->row());ui->plainTextEdit->setPlainText(strText);
}void MainWindow::SlotAddItem()
{QItemSelectionModel *pSelectionModel = ui->treeView->selectionModel();if (pSelectionModel->hasSelection()) {// 获取选中的索引列表QModelIndexList selectedIndexes = pSelectionModel->selectedIndexes();// 一般情况下,QTreeView 是单选,所以可以直接获取第一个选中的索引QModelIndex selectedIndex = selectedIndexes.first();// 如果需要处理特定列的数据,可以通过 QModelIndex 访问模型中的数据//QVariant data = selectedIndex.data(Qt::DisplayRole);TreeItem *pItem = static_cast<TreeItem*>(selectedIndex.internalPointer());TreeItem *pParentItem = pItem->parentItem();STUDENT* s = new STUDENT;s->name = QString("name10086");s->score1 = s->score2 = s->score3 = 10086;TreeItem *pAddItem = new TreeItem(pParentItem);pAddItem->setPtr(s);pAddItem->setLevel(2);pParentItem->appendChild(pAddItem);ui->treeView->setModel(model);// 方法1,递归方法//QModelIndex pParentIndex = model->indexOfItem(pParentItem);// 方法2,通过createIndexQModelIndex pParentIndex = model->indexFromItem(pParentItem);ui->treeView->collapse(pParentIndex);ui->treeView->expand(pParentIndex);}
}void MainWindow::SlotRightMenu(const QPoint &pos)
{//创建右键菜单QMenu menu;//添加actionQAction *actionDelete = new QAction(QStringLiteral("删除"));menu.addAction(actionDelete);connect(actionDelete, &QAction::triggered, this, &MainWindow::SlotTreeMenuDelete);menu.exec(ui->treeView->viewport()->mapToGlobal(pos));
}void MainWindow::SlotTreeMenuDelete()
{QItemSelectionModel *pSelectionModel = ui->treeView->selectionModel();if (pSelectionModel->hasSelection()){QModelIndexList selectedIndexes = pSelectionModel->selectedIndexes();QModelIndex selectedIndex = selectedIndexes.first();TreeItem *pItem = static_cast<TreeItem*>(selectedIndex.internalPointer());TreeItem *pParentItem = pItem->parentItem();pParentItem->removeChild(pItem->row());for (int i = 0; i < pParentItem->getChildList().size(); i++){TreeItem *pItemTemp = pParentItem->getChildList().at(i);pItemTemp->setRow(i);}QModelIndex pParentIndex = model->indexFromItem(pParentItem);ui->treeView->collapse(pParentIndex);ui->treeView->expand(pParentIndex);}
}

TreeItem.h

#pragma once
#include <QVariant>
#include <QList>
class TreeItem
{
public:explicit TreeItem(TreeItem *parentItem = nullptr);~TreeItem();int childCount() const;                 //子节点计数int row() const;                        //获取该节点是父节点的第几个子节点void appendChild(TreeItem *item);void removeChild(int index);QList<TreeItem*> getChildList();TreeItem *parentItem();                 //获取父节点指针TreeItem *child(int row);               //获取第row个子节点指针//核心函数:获取节点第column列的数据QVariant data(int column) const;//设置、获取节点是几级节点(就是树的层级)int level() { return m_nLevel; }void setLevel(int level) { m_nLevel = level; }//设置、获取节点存的数据指针void setPtr(void* p) { m_pPtr = p; }void* ptr() { return m_pPtr; }//保存该节点是其父节点的第几个子节点,查询优化所用void setRow(int row) {m_nRow = row;}private:TreeItem *m_pParentItem;QList<TreeItem*> m_listChildItems;int m_nLevel;void *m_pPtr;int m_nRow;};

TreeItem.cpp

#include "TreeItem.h"
#include "define.h"
TreeItem::TreeItem(TreeItem *parentItem /*= nullptr*/)
{m_pParentItem = parentItem;
}TreeItem::~TreeItem()
{}int TreeItem::childCount() const
{return m_listChildItems.count();
}int TreeItem::row() const
{return m_nRow;
}void TreeItem::appendChild(TreeItem *item)
{item->setRow(m_listChildItems.size());   //item存自己是第几个,可以优化效率m_listChildItems.append(item);
}void TreeItem::removeChild(int index)
{delete m_listChildItems.takeAt(index); // 删除并释放元素的内存
}QList<TreeItem*> TreeItem::getChildList()
{return m_listChildItems;
}TreeItem * TreeItem::parentItem()
{return m_pParentItem;
}TreeItem * TreeItem::child(int row)
{return m_listChildItems.value(row);
}QVariant TreeItem::data(int column) const
{if (m_nLevel == 1){//一级节点,班级if (column == 0){CLASS* c = (CLASS*)m_pPtr;return c->name;}}else if (m_nLevel == 2){//二级节点学生信息STUDENT* s = (STUDENT*)m_pPtr;switch (column){case 0: return s->name;case 1: return QString::number(s->score1);case 2: return QString::number(s->score2);case 3: return QString::number(s->score3);case 4: return QString::number(s->score1 + s->score2 + s->score3);case 5: return QString::number((s->score1 + s->score2 + s->score3) / 3);case 6:{if (s->score1 < 60 || s->score2 < 60 || s->score3 < 60){//任意一门课不合格则不合格return QStringLiteral("不合格");}else{return QStringLiteral("合格");}}case 7:{if (s->score1 >= 90 && s->score2 >= 90 && s->score3 >= 90){//每门课都达到90分以上评优return QStringLiteral("优秀");}else{return QStringLiteral("-");}}default:return QVariant();}}return QVariant();
}

TreeModel.h

#pragma once
#include "TreeItem.h"
#include <QAbstractItemModel>
class TreeModel : public QAbstractItemModel
{Q_OBJECT
public:explicit TreeModel(QStringList headers,QObject *parent = nullptr);~TreeModel();//以下为自定义model需要实现的一些虚函数,将会被Qt在查询model数据时调用//headerData: 获取表头第section列的数据//data: 核心函数,获取某个索引index的元素的各种数据//      role决定获取哪种数据,常用有下面几种://      DisplayRole(默认):就是界面显示的文本数据//      TextAlignmentRole:就是元素的文本对齐属性//      TextColorRole、BackgroundRole:分别指文本颜色、单元格背景色//flags: 获取index的一些标志,一般不怎么改//index: Qt向你的model请求一个索引为parent的节点下面的row行column列子节点的元素,在本函数里你需要返回该元素的正确索引//parent:获取指定元素的父元素//rowCount: 获取指定元素的子节点个数(下一级行数)//columnCount: 获取指定元素的列数Qt::ItemFlags flags(const QModelIndex &index) const override;QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;QModelIndex parent(const QModelIndex &child) const override;int rowCount(const QModelIndex &parent = QModelIndex()) const override;int columnCount(const QModelIndex &parent = QModelIndex()) const override;public:TreeItem *itemFromIndex(const QModelIndex &index) const;QModelIndex indexFromItem(const TreeItem *item) const;QModelIndex indexOfItem(TreeItem *item) const;QModelIndex recursiveIndexSearch(TreeItem *currentItem, TreeItem *targetItem) const;TreeItem *root();private:QStringList m_listHeaders;TreeItem *m_pRootItem;
};

TreeModel.cpp

#include "TreeModel.h"TreeModel::TreeModel(QStringList headers, QObject *parent /*= nullptr*/):QAbstractItemModel(parent)
{m_listHeaders = headers;m_pRootItem = new TreeItem;
}TreeModel::~TreeModel()
{}Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{if (!index.isValid()){return 0;}return QAbstractItemModel::flags(index);
}// 返回表头第section列的数据
QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/) const
{if (orientation == Qt::Horizontal){if (role == Qt::DisplayRole){return m_listHeaders.at(section);}}return QVariant();
}QVariant TreeModel::data(const QModelIndex &index, int role /*= Qt::DisplayRole*/) const
{if (!index.isValid()){return QVariant();}TreeItem *item = static_cast<TreeItem*>(index.internalPointer());if (role == Qt::DisplayRole){return item->data(index.column());}return QVariant();
}QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent /*= QModelIndex()*/) const
{if (!hasIndex(row, column, parent))return QModelIndex();TreeItem *parentItem;if (!parent.isValid()){parentItem = m_pRootItem;}else{parentItem = static_cast<TreeItem *>(parent.internalPointer());}TreeItem *pChildItem = parentItem->child(row);if (pChildItem){return createIndex(row,column,pChildItem);}else{return QModelIndex();}
}QModelIndex TreeModel::parent(const QModelIndex &child) const
{if (!child.isValid())return QModelIndex();TreeItem *childItem = static_cast<TreeItem*>(child.internalPointer());TreeItem *parentItem = childItem->parentItem();if (parentItem == m_pRootItem)return QModelIndex();return createIndex(parentItem->row(), 0, parentItem);
}int TreeModel::rowCount(const QModelIndex &parent /*= QModelIndex()*/) const
{TreeItem *parentItem;if (parent.column() > 0)return 0;if (!parent.isValid())parentItem = m_pRootItem;elseparentItem = static_cast<TreeItem*>(parent.internalPointer());return parentItem->childCount();
}int TreeModel::columnCount(const QModelIndex &parent /*= QModelIndex()*/) const
{return m_listHeaders.size();;
}TreeItem * TreeModel::itemFromIndex(const QModelIndex &index) const
{if (!index.isValid())return nullptr;TreeItem *item = static_cast<TreeItem *>(index.internalPointer());return item;
}QModelIndex TreeModel::indexFromItem(const TreeItem *item) const
{TreeItem *pItem = const_cast<TreeItem *>(item);if (pItem->parentItem() == m_pRootItem){return createIndex(pItem->row(), 0, pItem);}return QModelIndex();
}QModelIndex TreeModel::indexOfItem(TreeItem *item) const
{// 如果模型是树形结构,可以递归遍历查找return recursiveIndexSearch(m_pRootItem, item);
}QModelIndex TreeModel::recursiveIndexSearch(TreeItem *currentItem, TreeItem *targetItem) const
{if (currentItem == targetItem) {// 如果找到了目标项,返回其索引return createIndex(currentItem->row(), 0, currentItem);}// 递归搜索子项for (int i = 0; i < currentItem->childCount(); ++i) {QModelIndex idx = recursiveIndexSearch(currentItem->child(i), targetItem);if (idx.isValid()) {return idx;}}return QModelIndex();
}TreeItem * TreeModel::root()
{return m_pRootItem;
}
3.界面


二、重要部分代码解释

1.TreeModel.cpp

在TreeMode中,最重要的是data()函数,该函数决定数据是否能够直接在View层进行显示。该接口中的QModelIndex是树中哪个结点下哪一行哪一列的索引(Model-View主要依赖于QModelIndex来取数据显示)。QModelIndex详解看:QT模型视图MVC系列教程(2)-模型数据索引QModelIndex详解-CSDN博客

QVariant TreeModel::data(const QModelIndex &index, int role /*= Qt::DisplayRole*/) const
{if (!index.isValid()){return QVariant();}TreeItem *item = static_cast<TreeItem*>(index.internalPointer());if (role == Qt::DisplayRole){return item->data(index.column());}return QVariant();
}
2.TreeItem.cpp

TreeItem是自定义的一个item类,也就是树中显示的每一行数据在Model中的存储。View层会通过data函数来取要显示的数据。比如TreeModel::data中的return item->data(index.column());

QVariant TreeItem::data(int column) const
{if (m_nLevel == 1){//一级节点,班级if (column == 0){CLASS* c = (CLASS*)m_pPtr;return c->name;}}else if (m_nLevel == 2){//二级节点学生信息STUDENT* s = (STUDENT*)m_pPtr;switch (column){case 0: return s->name;case 1: return QString::number(s->score1);case 2: return QString::number(s->score2);case 3: return QString::number(s->score3);case 4: return QString::number(s->score1 + s->score2 + s->score3);case 5: return QString::number((s->score1 + s->score2 + s->score3) / 3);case 6:{if (s->score1 < 60 || s->score2 < 60 || s->score3 < 60){//任意一门课不合格则不合格return QStringLiteral("不合格");}else{return QStringLiteral("合格");}}case 7:{if (s->score1 >= 90 && s->score2 >= 90 && s->score3 >= 90){//每门课都达到90分以上评优return QStringLiteral("优秀");}else{return QStringLiteral("-");}}default:return QVariant();}}return QVariant();
}

相关文章:

QT的Model-View实现大批量数据展示

一、完整源代码 1.项目结构 2.各文件代码展示 define.h #pragma once #include <QVector>//学生信息 typedef struct _STUDENT {QString name; //姓名int score1; //语文成绩int score2; //数学成绩int score3; //外语成绩_STUDENT(){name ""…...

2024年8月7日(mysql主从 )

回顾 主服务器 [rootmaster_mysql ~]# yum -y install rsync [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz [rootmaster_mysql ~]# cp -r mysql-8.0.33-linux-glibc2.…...

接口/自动化测试 面试集合

1. apache和nginx的区别? Nginx相对Apache的优点: 轻量级&#xff0c;同样起web服务&#xff0c;比apache占用更少的内存及资源; 抗并发&#xff0c;nginx处理请求是异步非阻塞的&#xff0c;支持更多的并发连接&#xff0c;而apache则是阻塞型的&#xff0c;在高 并发下ngi…...

菜鸡勇闯第136场双周赛

菜鸡鼓足了勇气报名了力扣双周赛&#xff08;后来复盘才知道双周赛更难一点&#xff0c;我真是头铁。。&#xff09; 没想到还拿了个竞赛名次哈哈哈哈哈还在前50%&#xff0c;小力它真的&#xff0c;我哭死 为什么我本科被高数老师忽悠&#xff0c;去打了两年数模o(≧口≦)o 每…...

趋动科技陈飞:从小模型到大模型,AI时代下的数据中心建设

自AI大模型横空出世&#xff0c;不断推动着AI从学术界到产业界向大众破圈&#xff0c;新的时代正在来临。11月15-16日&#xff0c;由CDCC主办的“2023第11届数据中心标准大会”在北京国家会议中心盛大开幕。 本届大会的主题围绕“AI时代 重塑未来”&#xff0c;聚焦数据中心领…...

yolo v8 + flask部署到云服务器,以及问题记录

环境安装 1、运行项目报错&#xff1a;no python application found, check your startup logs for errors 在云服务器pytorch版本安装错了&#xff0c;安装了GPU版本&#xff0c;需要安装CPU版本 # CPU only 使用下面这段代码避免出现第二个错误 pip install torch2.3.1 to…...

【科研必备插件】easyscholar如何使文章显示期刊影响因子与分区等级

简要介绍 EasyScholar 是一个微软 Edge 浏览器的扩展程序&#xff0c;可以显示会议、期刊等级。可支持在各大论文搜索网站&#xff0c;显示各种期刊、会议等级排名 要想你的知网页面如下图所示&#xff0c;快来获取安装&#xff0c;快速科研有方法 插件安装教程 ①打开浏览器…...

UE5 UrlEncode转换

调用接口时用到了 UFUNCTION(BlueprintPure, Category "FuncLib", meta (Keywords "URL1"))static FString StringToURLEncode(const FString& str1);FString UBasicFuncLib::StringToURLEncode(const FString& str1){return FGenericPlatformH…...

【QML】Qt.rgba()的正确使用方法

1. 问题 设置颜色 color: Qt.rgba(65,105,225,255) &#xff0c;应该是蓝色&#xff0c;却显示白色。 2. 正确方法 //正确代码 color: Qt.rgba(65/255, 105/255, 225/255, 255/255)...

centos7.9 docker安装

1、不要通过yum直接安装 具体原因&#xff1a; CentOS 6 因内核太旧&#xff0c;即使支持安装 docker&#xff0c;但会有各种问题&#xff0c;不建议安装CentOS 7 的 extras 源虽然可以安装 docker&#xff0c;但包比较旧&#xff0c;建议从官方源或镜像源站点下载安装 docke…...

spring操作数据库

xml版 程序结构 配置文件 dbUtil-阿帕奇提供操作数据库的插件 核心类&#xff1a;QueryRunner .query() 查询 .update() 增删改 <dependencies><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spri…...

Apache Flink中TaskManager,SubTask,TaskSlot,并行度之间的关系

Apache Flink 中Application 与 Job 一个完整的Flink Application 一般组成如下&#xff1a; Source 数据来源Transformation 数据转换处理等Sink 数据传输 Flink 中一个或者多个Operator&#xff08;算子&#xff09;组合对数据进行转换形成一个 Transformation&#xff0c;一…...

马斯克xAI新计划:人工智能模型Grok 2测试版即将发布

特斯拉CEO马斯克在X平台上表示&#xff0c;人工智能模型Grok 2测试版即将发布。Grok&#xff0c;作为xAI公司的明星大语言模型&#xff0c;其首代产品Grok 1已凭借神经演化计算与深度学习技术的深度融合&#xff0c;展现了超乎想象的学习速度与智能深度&#xff0c;赢得了业界的…...

【机器人学】6-4.六自由度机器人运动学参数辨识-机器人精度验证【附MATLAB代码】

前言 前两个章节以及完成了机器人参数辨识。 【机器人学】6-1.六自由度机器人运动学参数辨识-辨识数学模型的建立 【机器人学】6-2.六自由度机器人运动学参数辨识-优化方法求解辨识参数 这里我们认为激光测量仪测量到的数据为机器人实际到达的位置&#xff0c;而机器人理论到…...

分销商城小程序系统渠道拓展

线上卖货渠道很多&#xff0c;想要不断提高营收和新客获取&#xff0c;除了自己和工具本身努力外&#xff0c;还需要其他人的帮助来提高商城店铺的整体销量。 搭建saas商城系统网站/小程序&#xff0c;后台上货&#xff0c;设置支付、配送、营销、精美模板商城装修等内容&…...

WPF篇(14)-ProgressBar进度条+Calendar日历控件+DatePicker日期控件

ProgressBar进度条 ProgressBar进度条通常在我们执行某个任务需要花费大量时间时使用&#xff0c;这时可以采用进度条显示任务或线程的执行进度&#xff0c;以便给用户良好的使用体验。 ProgressBar类定义 public class ProgressBar : RangeBase {public static readonly De…...

链表高频题目和必备技巧

链表高频题目和必备技巧 1. 链表类题目注意点 1&#xff0c;如果笔试中空间要求不严格&#xff0c;直接使用容器来解决链表问题 2&#xff0c;如果笔试中空间要求严格、或者在面试中面试官强调空间的优化&#xff0c;需要使用额外空间复杂度**O(1)**的方法 3&#xff0c;最…...

Vue3详细介绍,正则采集器所用前端框架

Vue3 引入了一个全新的响应式系统&#xff0c;它是基于ES6的Proxy特性构建的。这个系统使得 Vue 能够更加高效地追踪数据的变化&#xff0c;并在数据发生变化时自动更新DOM。响应式系统的核心是"可观察"&#xff0c;当数据变化时&#xff0c;视图会响应这些变化并重新…...

数据集--COCO2017(快速下载)

1、数据集介绍 数据集官网&#xff1a;https://cocodataset.org/#home COCO&#xff08;Common Objects in Context&#xff09;数据集是计算机视觉领域中最广泛使用的数据集之一&#xff0c;主要用于目标检测、分割和图像标注任务。COCO 数据集由 Microsoft 发布&#xff0c…...

【管理咨询宝藏159】顶级咨询公司人力三支柱建设方案思路

阅读完整版报告内容&#xff0c;请搜索VV号“管理咨询宝藏”。 【管理咨询宝藏159】顶级咨询公司人力三支柱建设方案思路 【格式】PDF版本 【关键词】人力咨询、三支柱、人力体系 【核心观点】 - 集团总部制定全集团共享中心总体规划路径&#xff0c;组织并负责实施与推广。各…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...