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

Qt第十四章 模型视图

Model/View(模型/视图)结构

文章目录

  • Model/View(模型/视图)结构
    • 简介
    • 视图组件
    • Model/View结构的一些概念
    • 项目控件组(item Widgets)
    • 模型/视图 如何使用
    • 项目视图组
      • 设置行的颜色交替变换
      • 拖拽
      • 设置编辑操作
      • 其他操作
    • 选择模型
      • 自定义选择多行
      • 全选
    • 代理 Delegate
      • 现有代理
      • 自定义代理
        • 通过QWidget设置代理
        • 通过QPainter设置代理

简介

模型视图结构是Qt中用界面组件显示与编辑数据的一种结构,视图是显示和编辑数据的界面组件,模型是视图与原始数据之间的接口
在这里插入图片描述

视图组件

  • QListView 用于显示单列的列表数据,使用于一维数据的操作
void Widget::initListModel()
{listMod = new QStandardItemModel; // 创建模型ui->listView->setModel(listMod); // 视图设置模型// 增加listMod->appendRow(new QStandardItem("item1")); // 往模型里插入数据for (int i = 2; i < 10; i++)listMod->appendRow(new QStandardItem(QString("item%1").arg(i)));listMod->insertRow(2, new QStandardItem("insert item")); // 在第二行插入新的数据// 删除listMod->removeRows(2, 1); // 从第二行开始删除1个,不包括第二行listMod->removeRow(8); // 删除第九行listMod->takeRow(0); // 移除第一行,内存还在,没被释放// 查找QList<QStandardItem*> findItem = listMod->findItems("item5"); // 查找叫做item5的行,返回所有找到的行listif (findItem.isEmpty())qDebug() << "没找到";elsefor (auto& find : findItem)qDebug() << find->text();QStandardItem* findItem2 = listMod->item(3, 0); // 查找第三行,第0列的元素if (findItem2)qDebug() << findItem2->text();findItem2->setEditable(false); // 设置不可编辑,双击没反应findItem2->setEnabled(false); // 设置不启用,变成灰色findItem2->setData(QString("display item"), Qt::DisplayRole);// 在第五行插入一个元素QMap<int, QVariant> map;map.insert(Qt::DisplayRole, QString("display"));map.insert(Qt::DecorationRole, QColor(0, 0, 255));map.insert(Qt::ToolTipRole, QString("tool tip"));auto it = listMod->item(5);qDebug() << map;listMod->setItemData(it->index(), map);// 自定义数据或角色findItem2->setData(QString("这是自定义角色"), Qt::UserRole + 1);qDebug() << findItem2->data(Qt::UserRole + 1);// 清除角色findItem2->clearData();
}
  • QTreeView 用于显示树状结构的数据
void Widget::initTreeModel()
{treeMod = new QStandardItemModel;ui->treeView->setModel(treeMod);treeMod->appendRow(new QStandardItem("item1"));treeMod->insertRow(1); // 在第一行插入一个空白行QStandardItem* root1 = new QStandardItem("root1");QStandardItem* root2 = new QStandardItem("root2");root1->appendRow(new QStandardItem("sub item"));QList<QStandardItem*> subItem1s;for (int i = 0; i < 5; i++)subItem1s.append(new QStandardItem(QString("su1b%1").arg(i)));QList<QStandardItem*> subItem2s;for (int i = 0; i < 5; i++)subItem2s.append(new QStandardItem(QString("su2b%1").arg(i)));root1->appendRow(subItem1s); // 只添加了su1b0root2->appendRows(subItem2s); // 添加多行treeMod->appendRow(root1);treeMod->appendRow(root2);
}
  • QTableView 显示表格状数据
void Widget::initTableModel()
{tableMod = new QStandardItemModel;ui->tableView->setModel(tableMod);QList<QStandardItem*> items, items1;for (int i = 0; i < 10; i++) {items.append(new QStandardItem(QString("item%1").arg(i)));items1.append(new QStandardItem(QString("abc%1").arg(i)));}tableMod->appendColumn(items1);tableMod->appendRow(items);tableMod->setHorizontalHeaderLabels(QStringList() << "h1"<< "h2"<< "h3"); // 添加水平方向表头
}
  • QColumnView 用多个QListView显示树状层次结构
  • QHeaderView 提供行表头或列表头的视图组件,如QTableView的行表头列表头

Model/View结构的一些概念

在这里插入图片描述

项目控件组(item Widgets)

模型/视图 如何使用

项目视图组

设置行的颜色交替变换

    QPalette palet;palet.setBrush(QPalette::Base, Qt::yellow);palet.setBrush(QPalette::AlternateBase, Qt::green);ui->listView->setPalette(palet);ui->listView->setAlternatingRowColors(true); // 开启颜色交替

拖拽

    ui->tableView->setDragEnabled(true); // 设置可以拖ui->tableView->setDragDropMode(QAbstractItemView::DragDrop); // 支持拖和放

移动内容需要重写事件

设置编辑操作

 ui->listView->setEditTriggers(QListView::AnyKeyPressed); // 设置按下任意键编辑

其他操作

	ui->tableView->setSelectionBehavior(QTableView::SelectRows); // 设置选择方式,默认选择一行ui->tableView->setSortingEnabled(true); // 设置自动排序,默认升序ui->listView->setViewMode(QListView::IconMode); // 设置视图模式为图标视图ui->listView->setFlow(QListView::TopToBottom); // 设置排列丛上到下ui->listView->setResizeMode(QListView::Adjust); // 设置随窗口改变适应布局ui->tableView->hideColumn(8); // 把第八列隐藏ui->tableView->showColumn(8); // 显示ui->tableView->setCornerButtonEnabled(false); // 设置左上角是否允许双击全选,默认是允许的

选择模型

Widget::Widget(QWidget* parent): QWidget(parent), ui(new Ui::Widget), model(new QStandardItemModel)
{ui->setupUi(this);ui->tableView->setModel(model);QList<QStandardItem*> items[5];for (int i = 0; i < 5; i++)for (int j = 0; j < 10; j++)items[i].append(new QStandardItem(QString("item%1").arg(j)));for (int i = 0; i < 5; i++)model->appendColumn(items[i]);// 设置自定义选择区域QItemSelectionModel* selectModel = ui->tableView->selectionModel(); // 获取当前的选择模型QModelIndex leftTop = model->index(0, 0);QModelIndex rightBottom = model->index(4, 2);QItemSelection selection(leftTop, rightBottom);selectModel->select(selection, QItemSelectionModel::Select);// 获取当前选择区域,并且修改它QModelIndexList indexs = selectModel->selectedIndexes();for (auto& i : indexs) {qDebug() << i.data();QStandardItemModel* item = (QStandardItemModel*)i.model();item->setData(i, "123", Qt::DisplayRole);item->setData(i, QIcon("C:/Users/PVer/Pictures/Resource/派蒙.jpeg"), Qt::DecorationRole);}
}

在这里插入图片描述

自定义选择多行

 	QModelIndex idx1 = model->index(0, 0); // 第0行第0列QModelIndex idx2 = model->index(0, 1); // 第0行第1列QModelIndex idx3 = model->index(1, 0); // 第1行第0列QModelIndex idx4 = model->index(0, 2); // 第0行第2列QItemSelection sel(idx1, idx3);QItemSelection sel1(idx2, idx4);selectModel->select(sel, QItemSelectionModel::SelectionFlag(0x0002 | 0x0020)); // 选中0,2行selectModel->select(sel1, QItemSelectionModel::SelectionFlag(0x0002 | 0x0040)); // 选中1,2列

在这里插入图片描述

全选

    QModelIndex topLeft = model->index(0, 0); // 获取左上角QModelIndex bottomRight = model->index(model->rowCount() - 1, model->columnCount() - 1); // 获取右下角QItemSelection selAll(topLeft, bottomRight);selectModel->select(selAll, QItemSelectionModel::Select);

代理 Delegate

代理就是在视图组件上为编辑数据提供编辑器,如在表格组件中编辑一个单元格的数据时,缺省是使用一个QLineEdit编辑框。代理负责从数据模型获取相应的数据,然后显示在编辑器里,修改数据后,又将其保存到数据模型中。

现有代理

视图本身有一个代理,可以编辑

自定义代理

通过QWidget设置代理
  1. 给列表视图加入你创建的代理类
ui->tableView->setItemDelegate(new CustomDelegate); // 设置代理
  1. 创建一个代理的类CustomDelegate继承自QStyledItemDelegate
    头文件
#ifndef CUSTOMDELEGATE_H
#define CUSTOMDELEGATE_H#include <QStyledItemDelegate>
#include <QWidget>class CustomDelegate : public QStyledItemDelegate {Q_OBJECT
public:CustomDelegate(QObject* parent = nullptr);QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;void setEditorData(QWidget* editor, const QModelIndex& index) const override;void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override;void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};#endif // CUSTOMDELEGATE_H

源文件

#include "CustomDelegate.h"
#include <QSpinBox>CustomDelegate::CustomDelegate(QObject* parent): QStyledItemDelegate(parent)
{
}QWidget* CustomDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{QSpinBox* box = new QSpinBox(parent);box->setMaximum(100);box->setMinimum(0);box->setFrame(false); // 设置微调框不显示边框return box;
}void CustomDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{int v = index.data().toInt();QSpinBox* box = dynamic_cast<QSpinBox*>(editor);box->setValue(v); // 设置微调框里的初始数值
}void CustomDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{QSpinBox* box = dynamic_cast<QSpinBox*>(editor);box->interpretText();int v = box->value();model->setData(index, v, Qt::DisplayRole);
}void CustomDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const
{editor->setGeometry(option.rect); // 设置微调框大小和位置和模型窗口重叠
}
  1. 此处是用微调框做的代理类,效果如图
    在这里插入图片描述
通过QPainter设置代理

QQ聊天的例子
在这里插入图片描述
新建头文件

#ifndef CUSTOMDELEGAT2_H
#define CUSTOMDELEGAT2_H#include <QStyledItemDelegate>
#include <QWidget>class CustomDelegat2 : public QStyledItemDelegate {Q_OBJECT
public:explicit CustomDelegat2(QObject* parent = nullptr);void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;void setEditorData(QWidget* editor, const QModelIndex& index) const override;virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override;
};#endif // CUSTOMDELEGAT2_H

源文件

#include "CustomDelegat2.h"
#include <QPainter>CustomDelegat2::CustomDelegat2(QObject* parent): QStyledItemDelegate { parent }
{
}void CustomDelegat2::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{QRect area = option.rect; // 获取绘制区域// 获取图标并绘制QRect r1 = QRect(area.topLeft(), QSize(area.width() / 3, area.height()));painter->drawPixmap(r1, QPixmap("C:/Users/PVer/Pictures/Resource/BinQQqq.bmp"));// 绘制名称QRect r2 = QRect(r1.topRight(), QSize(r1.width(), r1.height() / 2));painter->drawText(r2, "梦想盛开的地方");// 绘制消息QRect r3 = QRect(r2.bottomLeft(), r2.size());painter->drawText(r3, "是要做什么的");// 绘制日期QRect r4 = QRect(r2.topRight(), r2.size());painter->drawText(r4, "7-23");
}QSize CustomDelegat2::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
{return QSize(option.widget->width(), 50);
}QWidget* CustomDelegat2::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{return new QWidget(parent);
}void CustomDelegat2::setEditorData(QWidget* editor, const QModelIndex& index) const
{
}void CustomDelegat2::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
}

代码里加入树视图,并且设置自定义模型

    listModel = new QStandardItemModel;ui->listView->setModel(listModel);ui->listView->setItemDelegate(new CustomDelegat2);listModel->appendRow(new QStandardItem);listModel->appendRow(new QStandardItem);listModel->appendRow(new QStandardItem);

在这里插入图片描述

相关文章:

Qt第十四章 模型视图

Model/View(模型/视图&#xff09;结构 文章目录 Model/View(模型/视图&#xff09;结构简介视图组件Model/View结构的一些概念项目控件组&#xff08;item Widgets&#xff09;模型/视图 如何使用项目视图组设置行的颜色交替变换拖拽设置编辑操作其他操作 选择模型自定义选择多…...

硬件工程师必须掌握的MOS管详细知识

MOS管&#xff0c;全称为金属-氧化物半导体场效应晶体管&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff0c;MOSFET&#xff09;&#xff0c;是一种重要的半导体器件&#xff0c;广泛应用于电子工业中各种电路的开关、放大、调制、数字电路和模拟电路等…...

希尔排序,详细解析(附图解)

1.希尔排序思路 希尔排序是一种基于插入排序的算法&#xff0c;通过将原始数据分成若干个子序列&#xff0c;然后对子序列进行插入排序&#xff0c;逐渐减小子序列的间隔&#xff0c;最后对整个序列进行一次插入排序。 1.分组直接插入排序&#xff0c;目标接近有序--------…...

【C语言篇】编译和链接以及预处理介绍(下篇)

文章目录 前言#和###运算符##运算符 命名约定#undef命令⾏定义条件编译#if和#endif多个分支的条件编译判断是否被定义嵌套指令 头文件被包含头文件被包含的方式本地文件包含库文件的包含 嵌套文件包含 其他预处理指令 写在最后 前言 本篇接前一篇【C语言篇】编译和链接以及预处…...

利用Llama2 7b自己实现一套离线AI

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; 可以当故事来看&#xff0c;轻松学习。 离了 ChatGPT 本人简直寸步难行&#xff0c;今天 ChatGPT 大面积宕机&#xff0c;服务直到文章写作&am…...

Ciallo~(∠・ω・ )⌒☆第十七篇 Ubuntu基础使用 其一

Ubuntu是一种基于Linux的操作系统&#xff0c;它是开源的、免费的&#xff0c;并且具有广泛的用户群体。 基本文件操作&#xff1a;Ubuntu使用命令行工具来进行文件操作。以下是一些常用的命令&#xff1a; 切换到用户主目录&#xff1a; cd ~ 切换到上级目录&#xff1a; cd .…...

Linux-零拷贝技术

什么是零拷贝&#xff1f; 在传统的数据传输过程中&#xff0c;数据需要从磁盘读取到内核空间的缓冲区&#xff0c;然后再从内核空间拷贝到用户空间的应用程序缓冲区。如果需要将数据发送到网络&#xff0c;数据还需要再次从用户空间拷贝到内核空间的网络缓冲区。这个过程涉及…...

小区团购管理

TOC springboot254小区团购管理 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&…...

图像文本擦除无痕迹!复旦提出EAFormer:最新场景文本分割新SOTA!(ECCV`24)

文章链接&#xff1a;https://arxiv.org/pdf/2407.17020 git链接&#xff1a;https://hyangyu.github.io/EAFormer/ 亮点直击 为了在文本边缘区域实现更好的分割性能&#xff0c;本文提出了边缘感知Transformer&#xff08;EAFormer&#xff09;&#xff0c;该方法明确预测文…...

Codeforces Round 966 (Div. 3)(A,B,C,D,E,F)

A. Primary Task 签到 void solve() {string s;cin>>s;bool bltrue;if(s.size()<2)blfalse;else{if(s.substr(0,2)"10"){if(s[2]0)blfalse;else if(s[2]1&&s.size()<3)blfalse; }else blfalse;}if(bl)cout<<"YES\n";else cout…...

【代码随想录算法训练营第42期 第六天 | LeetCode242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和】

代码随想录算法训练营第42期 第六天 | LeetCode242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和 一、242.有效的字母异位词 解题代码C&#xff1a; bool isAnagram(char* s, char* t) {int len1 strlen(s);int len2 strlen(t);int al[26] {0};int b…...

WebRTC音视频开发读书笔记(一)

一、基本概念 WebRTC(Web Real-Time Communication&#xff0c;网页即时通信)于2011年6月1日开源&#xff0c;并被纳入万维网联盟的W3C推荐标准&#xff0c;它通过简单API为浏览器和移动应用提供实时通信RTC功能。 1、特点 跨平台&#xff1a;可以在Web&#xff0c;Android、…...

llama3.1本地部署方式

llama3.1 资源消耗情况 &#xfeff;Llama 3.1 - 405B、70B 和 8B 的多语言与长上下文能力解析&#xfeff; &#xfeff; 70B版本&#xff0c;FP1616K token需要的资源约为75G&#xff1b;FP16128K token需要的资源约为110G &#xfeff; 1、ollama ollama工具部署及使用…...

相机光学(三十四)——色差仪颜色观察者视角

1.为什么会有观察者视角 颜色观察角度主要涉及到人眼观察物体时&#xff0c;‌视角的大小以及屏幕显示颜色的方向性对颜色感知的影响。‌ 人眼观察物体的视角&#xff1a;‌在黑暗条件下&#xff0c;‌人眼主要依靠杆体细胞来分辨物体的轮廓&#xff0c;‌而杆体细胞分布在视网…...

思二勋:web3.0是打造应对复杂市场敏捷组织的关键

本文内容摘自思二勋所著的《分布式商业生态战略》一书。 数字化时代,需要企业具备敏捷应对变化的能力,以敏捷反应应对客户和市场的迅速变化。敏捷能力的建设需要触点网络、信息系统、IT 架构、业务流程等同时实现敏捷。尤其是在多变且复杂环境中,特别要求战略管理的敏捷性和…...

一文带你快速了解——HAProxy负载均衡

一、HAProxy简介 1.1、什么是Haproxy HAProxy是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统计。…...

【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分

✨ 人生如梦&#xff0c;朝露夕花&#xff0c;宛若泡影 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…...

启发式算法之模拟退火算法

文章目录 1. 模拟退火算法概述1.1 算法起源与发展1.2 算法基本原理 2. 算法实现步骤2.1 初始化过程2.2 迭代与降温策略 3. 模拟退火算法的优化策略3.1 冷却进度表的设计3.2 参数调整与策略 4. 模拟退火算法的应用领域4.1 组合优化问题4.1.1 旅行商问题&#xff08;TSP&#xff…...

编码器汇总:光学编码器,霍尔编码器,磁性编码器,电容式编码器,单圈编码器,多圈编码器,增量式编码器,绝对值式编码器等

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、光学编码器二、霍尔编码器三、磁性编码器四、电容式编码器五、单圈编码器六、多圈编码器七、增量式编码器八、…...

有哪些性价比高的蓝牙耳机可入?四款百万好评实力品牌推荐!

蓝牙耳机大家都再熟悉不过了&#xff0c;作为最常用的智能配件之一&#xff0c;谁还没有用过几款蓝牙耳机呢&#xff0c;但是选购蓝牙耳机上还是有一些需要注意的地方&#xff0c;市面上的吹风机可谓是五花八门。有哪些性价比高的蓝牙耳机可入&#xff1f;本人花了一些时间整理…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

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

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