Qt中txt文件输出为PDF格式
main.cpp
PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") == -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntry> entries;if (!pdfReportGenerator.parseLogFile("1.txt", entries)) {QMessageBox::critical(nullptr, "错误", "无法打开日志文件");return ;}// 生成PDF表格pdfReportGenerator.createPdfWithTable(entries);QMessageBox::information(nullptr, "完成", "PDF表格已生成: output_table.pdf");
字体文件放入资源路径,字体下载网站GitCode - 全球开发者的开源社区,开源代码托管平台
类实现
.cpp文件
#include "PdfReportGenerator.h"bool PdfReportGenerator::parseLogFile(const QString &filename, QVector<LogEntry> &entries) {QFile file(filename);if (!file.open(QIODevice::ReadOnly)) return false;QTextStream in(&file);in.setCodec("UTF-8");in.readLine(); // 跳过标题行while (!in.atEnd()) {QString line = in.readLine().trimmed();if (line.isEmpty()) continue;QStringList parts = line.split("\t", Qt::SkipEmptyParts);if (parts.size() < 6) continue;LogEntry entry;entry.command = parts[0].trimmed();entry.frame = parts[1].trimmed();entry.success = parts[2].trimmed().toInt();entry.fail = parts[3].trimmed().toInt();entry.timeout = parts[4].trimmed();entry.duration = parts[5].replace("ms", "").trimmed().toInt();entry.gapPos = (parts.size() > 6) ? parts[6].trimmed() : "";entries.append(entry);}return true;
}void PdfReportGenerator::createPdfWithTable(const QVector<LogEntry> &entries) {// 创建文档对象QTextDocument doc;QTextCursor cursor(&doc);// 设置中文字体QFont font("SimSun", 10);doc.setDefaultFont(font);// 添加标题cursor.insertText("日志数据报表\n", QTextCharFormat());cursor.insertBlock();// 创建表格(列数=7,行数=数据行数+1)QTextTable *table = cursor.insertTable(entries.size() + 1, 7);// 设置表头QStringList headers = {"命令", "帧/时间/次数", "成功次数","失败次数", "是否超时", "消耗时间", "缝隙位置"};for (int i = 0; i < headers.size(); ++i) {QTextTableCell cell = table->cellAt(0, i);QTextCursor cellCursor = cell.firstCursorPosition();cellCursor.insertText(headers[i]);cell.format().setBackground(Qt::lightGray); // 表头背景色}// 填充数据for (int row = 0; row < entries.size(); ++row) {const LogEntry &entry = entries[row];QStringList rowData = {entry.command,entry.frame,QString::number(entry.success),QString::number(entry.fail),entry.timeout,QString::number(entry.duration) + "ms",entry.gapPos};for (int col = 0; col < rowData.size(); ++col) {QTextTableCell cell = table->cellAt(row + 1, col);QTextCursor cellCursor = cell.firstCursorPosition();cellCursor.insertText(rowData[col]);// 数字列右对齐if (col >= 2 && col <= 5) {QTextBlockFormat format;format.setAlignment(Qt::AlignRight);cellCursor.setBlockFormat(format);}}}// 设置表格样式QTextTableFormat tableFormat;tableFormat.setHeaderRowCount(1);tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid);tableFormat.setBorder(1);table->setFormat(tableFormat);// 导出PDFQPrinter printer(QPrinter::HighResolution);printer.setOutputFormat(QPrinter::PdfFormat);printer.setOutputFileName("output_table.pdf");printer.setPageSize(QPageSize(QPageSize::A4));doc.print(&printer);
}
.h文件
#ifndef PDFREPORTGENERATOR_H
#define PDFREPORTGENERATOR_H
#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QTextDocument>
#include <QTextTable>
#include <QPrinter>
#include <QFontDatabase>
#include <QPdfWriter>
#include <QPainter>
#include "qcustomplot.h"struct LogEntry {QString command;QString frame;int success;int fail;QString timeout;int duration;QString gapPos;
};class PdfReportGenerator : public QObject {
public:void createPdfWithTable(const QVector<LogEntry> &entries);bool parseLogFile(const QString &filename, QVector<LogEntry> &entries);
};#endif // PDFREPORTGENERATOR_H
实现效果
相关文章:

Qt中txt文件输出为PDF格式
main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…...

《HelloGitHub》第 107 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…...
Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
在 LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法 这篇博客中,我们了解了格式化LLM输出内容的必要性以及如何通过调用langchain框架中提供的 with_structured_output() 方法对LLM输出进行格式化(三种可选方…...

AI数据分析:deepseek生成SQL
在当今数据驱动的时代,数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展,AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道,SQL 查询语…...
力扣-动态规划-115 不同子序列
思路 dp数组定义:0_i-1的字符串中有0_j-1的字符串有dp[i][j]个递推公式: if(s[i-1] t[j-1]){dp[i][j] dp[i-1][j-1] dp[i-1][j]; }else{dp[i][j] dp[i-1][j]; } 在该元素相同时,有两种可能1:使用该元素,所以0_i-2…...

Qt C++ 开发 动态上下页按钮实现
项目开发,想实现动态的显示按钮,考虑使用QStackedWidget做两个页面去切换。 首先,我们使用Qt ui 画出两个QStackedWidget的两个页面 要实现切换,我们只需要调用stackedWidget->setCurrentIndex(index)就行。 那么如何自动调…...

数据结构第五节:排序
1.常见的排序算法 插入排序:直接插入排序、希尔排序 选择排序:直接选择排序、堆排序 交换排序:冒泡排序、快速排序 归并排序:归并排序 排序的接口实现: // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…...

从文件到块: 提高 Hugging Face 存储效率
Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制,任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本,因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间&#…...
Android14 串口控制是能wifi adb实现简介
Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb(1)相关prop属性设置(2)在设置界面或者 ifconfi…...
vue3中 组合式~测试深入组件:事件 与 $emit()
一、语法(props) 第一步:在组件模板表达式中,可以直接用$emit()方法触发自定义事件, <!-- MyComponent --> <button click"$emit(someEvent)">Click Me</button> 第二步父组件可以通过 v-on (缩写为 ) 来监听…...

SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...

基于微信小程序的停车场管理系统的设计与实现
第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展,各行各业都在摸索移动互联对本行业的改变,不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件,但是APP作为一个只为某个公司服务的一个软件&a…...

DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...

table 拖拽移动
表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...
Linux使用笔记:Find Tree 命令
Tree 命令的使用 使用-I 参数,过滤掉不想展未的目录或文件使用-L参数,指定展示的目录层级个数 arsenaltxzq1899:~/Workspace/vue-application$ tree -I node_modules/ -I public/ -L 2 . ├── components.json ├── Dockerfile ├── ecosystem.c…...

数据结构入门篇——什么是数据结构。
一、引入 工具是一种什么东西呢?是一种转化媒介,我们需要熟食,我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉,通过工具——火的加工,从而得到我们的目的产物——熟肉。 将上面的例子和红字部…...

MySQL-简介与基本命令
数据库 主流数据库 关系型数据库 MySQL:开源免费的关系型数据库,易于使用和学习,支持大型企业级应用。其特点包括高性能、可靠性和可扩展性,支持多种编程语言和操作系统,拥有大量的社区支持和插件SQLite:…...

汽车材料耐候性测试仪器-太阳光模拟器介绍
**太阳光模拟器**是一种用于模拟太阳光谱的设备,广泛应用于汽车材料的耐候性测试。通过模拟太阳光中的紫外线、可见光和红外线,评估材料在长期光照下的性能变化。 主要组成部分 1. **光源系统**: - **氙灯**:最常用的光源&…...

音频3A测试--AEC(回声消除)测试
一、测试前期准备 一台录制电脑:用于作为近段音源和收集远端处理后的数据; 一台测试设备B:用于测试AEC的设备; 一个高保真音响:用于播放设备B的讲话; 一台播放电脑:用于模拟设备A讲话,和模拟设备B讲话; 一台音频处理器(调音台):用于录制和播放数据; 测试使用转接线若…...

DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...