1.tableView导出到excel

 点击导出函数按钮、发送sendMessage信号(信号名称,对象,数据)

void HydroelectricPowerPluginImpl::exportTableViewSelectedRows(QTableView* tableView, QWidget* parent)
{if (!tableView || !tableView->model())return;QString fileName = QFileDialog::getSaveFileName(parent, "导出选中行为CSV", "", "CSV文件 (*.csv)");if (fileName.isEmpty())return;QFile file(fileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text))return;QTextStream out(&file);QAbstractItemModel* model = tableView->model();// 写表头QStringList headers;for (int col = 0; col < model->columnCount(); ++col) {headers << model->headerData(col, Qt::Horizontal).toString();}out << headers.join(",") << "\n";// 写选中行数据for (int row = 0; row < model->rowCount(); ++row) {QStringList rowData;for (int col = 0; col < model->columnCount(); ++col) {if (model->data(model->index(row, col)) != QVariant()) {rowData << model->data(model->index(row, col)).toString();}if (model->data(model->index(row, col), Qt::UserRole) != QVariant()) {rowData << F0(model->data(model->index(row, col), Qt::UserRole).toInt());}}out << rowData.join(",") << "\n";}file.close();
}

2.点击button导出tableview

 

bool Utils::Gui::ExportVisibleColumnsToCSV(QTableView* tableView, const QString& filename, bool delegate, std::function<QString(const QVariant&)> v2s)
{QAbstractItemModel* model = tableView->model();if (model == nullptr) {return false;}QFile file(filename);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {return false;}QTextStream ts(&file);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QTextCodec* codec = QTextCodec::codecForName("UTF-8");if (codec) {ts.setCodec(codec);} else {ts.setCodec(QTextCodec::codecForLocale());}ts.setGenerateByteOrderMark(true);
#elsets.setEncoding(QStringConverter::System);
#endifQHeaderView* header = tableView->horizontalHeader();QList<int> visibleCols;for (int col = 0; col < model->columnCount(); ++col) {if (delegate || (!header->isSectionHidden(col) && !IsColumnUsingCustomDelegate(tableView, col))) {visibleCols.append(col);}}// 按视觉顺序排序std::sort(visibleCols.begin(), visibleCols.end(), [header](int a, int b) {return header->visualIndex(a) < header->visualIndex(b);});QStringList headerList;for (int col : visibleCols) {headerList << EscapeCSV(model->headerData(col, Qt::Horizontal).toString());}ts << headerList.join(',') << '\n';// 写入数据行for (int row = 0; row < model->rowCount(); ++row) {QStringList rowData;for (int col : visibleCols) {QModelIndex index = model->index(row, col);auto&& v = model->data(index);rowData << EscapeCSV(v2s == nullptr ? v.toString() : v2s(index));}ts << rowData.join(',') << '\n';}file.close();return true;
}QString Utils::Gui::EscapeCSV(const QString& value)
{if (value.contains('"') || value.contains(',') || value.contains('\n') || value.contains('\r')) {QString escaped = value;escaped.replace("\"", "\"\"");return "\"" + escaped + "\"";}return value;
}

 代码分析:

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QTextCodec* codec = QTextCodec::codecForName("UTF-8");if (codec) {ts.setCodec(codec);} else {ts.setCodec(QTextCodec::codecForLocale());}ts.setGenerateByteOrderMark(true);
#elsets.setEncoding(QStringConverter::System);
#endif详细解释
1. #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
•	这部分代码只在 Qt 5 及以下版本编译时生效。
•	Qt 5 及以下用 QTextCodec 设置编码。
代码含义:
•	QTextCodec* codec = QTextCodec::codecForName("UTF-8");
尝试获取 UTF-8 编码的 QTextCodec。
•	if (codec) { ts.setCodec(codec); }
如果获取成功,设置 QTextStream 使用 UTF-8 编码。
•	else { ts.setCodec(QTextCodec::codecForLocale()); }
如果失败,则使用系统默认编码。
•	ts.setGenerateByteOrderMark(true);
让输出流在文件开头写入 UTF-8 的 BOM(字节顺序标记),有些软件(如 Excel)读取 CSV 时需要 BOM 才能正确识别为 UTF-8。
2. #else
•	这部分代码只在 Qt 6 及以上版本编译时生效。
•	Qt 6 移除了 QTextCodec,改用 QStringConverter。
代码含义:
•	ts.setEncoding(QStringConverter::System);
设置 QTextStream 使用系统默认编码(通常是 UTF-8)。总结
•	目的:保证导出的 CSV 文件编码为 UTF-8,兼容不同 Qt 版本。
•	“坑”提示:如果编码设置不对,中文等非 ASCII 字符在 Excel 等软件中可能会乱码。简要记忆:
Qt 5 用 QTextCodec,Qt 6 用 QStringConverter,都为了让文件编码正确。
    // 按视觉顺序排序std::sort(visibleCols.begin(), visibleCols.end(), [header](int a, int b) {return header->visualIndex(a) < header->visualIndex(b);});这行代码的作用是:按照表头的视觉顺序对 visibleCols 进行排序。
详细解释
•	visibleCols 是一个存储可见列索引(int)的列表。
•	header 是 QTableView 的水平表头(QHeaderView*)。
•	header->visualIndex(a) 返回列 a 在界面上显示的位置(比如用户拖动列顺序后,物理列索引和视觉顺序可能不同)。
•	std::sort(..., [header](int a, int b) { ... })
使用 lambda 表达式自定义排序规则:如果 a 的视觉索引小于 b,则 a 排在前面。
举例说明
假设表格有 4 列,物理顺序是 0,1,2,3,但用户把第2列拖到最前面,视觉顺序变成 2,0,1,3。
此时 header->visualIndex(2) 返回 0,header->visualIndex(0) 返回 1,依此类推。
排序后,visibleCols 就会按照用户看到的顺序排列,而不是物理顺序。常见“坑”提示:
如果你直接用物理顺序导出数据,用户看到的列顺序和导出的顺序可能不一致。用这段代码可以保证导出顺序和界面一致,体验更好

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87296.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87296.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/87296.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSCP - Proving Grounds - DC - 1

主要知识点 drupal 7 RCEfind SUID提权 具体步骤 nmap起手,80端口比较有意思&#xff0c;安装了 Drupal 7 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-17 14:23 UTC Nmap scan report for 192.168.57.193 Host is up (0.00087s latency). Not shown: 65531 cl…

仿小红书交流社区(微服务架构)

文章目录 framework - 平台基础设施starter - jacksoncommonexceptionresponseutil starter - content 全局上下文distributed - id - generate - 分布式 IdSnowflake - 基于雪花算法生成 IdSegment - 基于分段式生成 Id OSS - 对象存储KV - 短文本存储笔记评论 user - 用户服务…

大模型开源技术解析 4.5 的系列开源技术解析:从模型矩阵到产业赋能的全栈突破

提示&#xff1a;本篇文章 1300 字&#xff0c;阅读时间&#xff1a;5分钟。 前言 6 月 30 日&#xff0c;百度正式开源文心大模型 4.5 系列&#xff0c;这一动作不仅兑现了 2 月发布会上的技术承诺&#xff0c;更以 10 款全维度模型矩阵刷新了国内开源模型的技术边界。从学术…

[6-02-01].第05节:配置文件 - YAML配置文件语法

SpringBoot学习大纲 一、YAML语法 1.1.概述&#xff1a; 1.YAML是一种数据序列化格式&#xff1b;2.它是以数据为中心3.容易阅读&#xff0c;容易与脚本语言交互,如下图所示&#xff1a; 1.2.基本语法 1.key: value&#xff1a;kv之间有空格2.使用缩进表示层级关系3.缩进时…

FPGA学习

一、module : 定义&#xff1a; 是构建数字系统的基本单元&#xff0c;用于封装电路的结构和行为。它可以表示从简单的逻辑门到复杂的处理器等任何硬件组件。 1. module 的基本定义 module 模块名 (端口列表);// 端口声明input [位宽] 输入端口1;output [位宽] 输出端口1;ino…

26-计组-存储器与Cache机制

一、存储器与局部性原理 1. 局部性原理 基础概念&#xff1a; 时间局部性&#xff1a;一个存储单元被访问后&#xff0c;短时间内可能再次被访问&#xff08;例如循环变量&#xff09;。空间局部性&#xff1a;一个存储单元被访问后&#xff0c;其附近单元可能在短时间内被访…

I/O 线程 7.3

前言 以下&#xff1a; 概述 1.基础 2.代码演示 3.练习 4.分析题 1.基础 一、线程基础概念 并发执行原理 通过时间片轮转实现多任务"并行"效果 实际为CPU快速切换执行不同线程 线程 vs 进程 线程共享进程地址空间&#xff0c;切换开销更小 进程拥有独立资源&am…

MySQL JSON数据类型完全指南:从版本演进到企业实践的深度对话

&#x1f4ca; MySQL JSON数据类型完全指南&#xff1a;从版本演进到企业实践的深度对话 在当今数据驱动的时代&#xff0c;MySQL作为最受欢迎的关系型数据库之一&#xff0c;不断演进以满足现代应用的需求。JSON数据类型的引入&#xff0c;让MySQL在保持关系型数据库优势的同时…

BI × 餐饮行业 | 以数据应用重塑全链路业务增长路径

在竞争激烈的餐饮行业中&#xff0c;数据已成为企业保持竞争力的关键资产。通过深入分析顾客数据&#xff0c;餐饮企业能够洞察消费者的需求和偏好&#xff0c;从而提供更加精准和个性化的服务。此外&#xff0c;利用数据优化业务管理&#xff0c;降低成本&#xff0c;并提高运…

【学习线路】机器学习线路概述与内容关键点说明

文章目录 零、机器学习的企业价值一、基础概念1. 机器学习定义2. 学习类型3. 学习范式 二、核心算法与技术1. 监督学习2. 无监督学习3. 模型评估与优化 三、深度学习与神经网络1. 神经网络基础2. 深度学习框架3. 应用场景 四、工具与实践1. 数据处理2. 模型部署3. 机器学习的生…

Linux 命令:cp

Linux cp 命令详细教程 cp 是 Linux 系统中最常用的命令之一&#xff0c;用于复制文件或目录。它可以将源文件/目录复制到指定的目标位置&#xff0c;支持批量复制、强制覆盖、保留文件属性等功能。下面详细介绍其用法。资料已经分类整理好&#xff1a;https://pan.quark.cn/s…

java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践

MyBatis-Plus分页 vs PageHelper分页&#xff1a;全面对比与最佳实践 一、分页技术概述 在Java持久层框架中&#xff0c;分页是高频使用的功能。主流方案有&#xff1a; MyBatis-Plus分页&#xff1a;MyBatis增强工具的内置分页方案PageHelper分页&#xff1a;独立的MyBatis…

PROFINET转MODBUS TCP网关在机械臂通信操作中的应用研究

在特定的汽车零部件生产工厂焊接生产线上&#xff0c;机械臂被应用于焊接作业&#xff0c;其控制体系基于Profinet协议。同时&#xff0c;工厂的自动化控制体系以西门子S7-1200PLC为核心&#xff0c;通过ModbusTCP协议实现数据交换。为实现焊接过程的自动化控制以及生产数据的实…

Mac中如何Chrome禁用更新[update chflags macos]

写在前面 在 macOS 系统中&#xff0c;系统更新提示的小红点常常让人不胜其扰。 尤其是当你希望保持现有系统的稳定性&#xff0c;或因兼容性问题暂不想升级时&#xff0c;这个小红点就像一个顽固的提醒。 - windowsMac版直接删除更新程序, 有效 cd ~/Library/Google/Googl…

LoRA使用-多个LoRA

LoRA的风格分类 不用去记它有什么很特别的风格&#xff0c;简单来说基础模型就像一个全能画手&#xff0c;什么都能画&#xff0c;而LoRA是在某个风格中经过特训的它的一个分身。使得它更精通该风格。 关于LoR风格分类&#xff1a;提示词撰写公式 Checkpoint&LoRA对比 训…

牛客刷题 — 【排序】[NOIP2012] 国王的游戏(高精度结构体排序)

1.题面&#xff1a;传送门 2. 思路&#xff1a; 相邻的两个大臣的先后顺序只会互相影响&#xff0c;并不会影响其他人的金币数。 假设前 i-1 个人左手上的数乘积为 s 。 ① 若 A 大臣排在B 大臣的前面&#xff0c;则&#xff1a; s 此时的金币数最大值为 。 ② 若B大臣排…

grpc 和限流Sentinel

基于gRPC的微服务通信模块技术方案书 1. 总体架构设计 #mermaid-svg-TiN9cudEfW5mCWHm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TiN9cudEfW5mCWHm .error-icon{fill:#552222;}#mermaid-svg-TiN9cudEfW5mCWHm…

经典灰狼算法+编码器+双向长短期记忆神经网络,GWO-Transformer-BiLSTM多变量回归预测,作者:机器学习之心!

经典灰狼算法编码器双向长短期记忆神经网络&#xff0c;GWO-Transformer-BiLSTM多变量回归预测&#xff0c;作者&#xff1a;机器学习之心&#xff01; 目录 经典灰狼算法编码器双向长短期记忆神经网络&#xff0c;GWO-Transformer-BiLSTM多变量回归预测&#xff0c;作者&#…

VGG Image Annotator (VIA):一款免费的数据标注软件介绍与使用

VGG Image Annotator (VIA)&#xff1a;一款免费的数据标注软件介绍与使用 在计算机视觉领域&#xff0c;数据标注是训练机器学习模型的基础步骤之一&#xff0c;而标注工具的选择直接影响标注的效率和准确性。众多标注工具中&#xff0c;VGG Image Annotator (VIA) 是一个开源…

CSS实现百分比水柱图

背景 在echarts没发现有可以直接使用的展示百分比的柱形图,只好自己封装一个组件使用 实现思路 一、图形拆解 要实现的组件是一个 可配置的圆柱形液柱图组件&#xff0c;常用于展示比例进度&#xff0c;比如任务完成度、指标达成率等。把图拆成最小单元然后拼接起来&#x…