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…...
《大语言模型的原理发展与应用》:此文为AI自动生成
《大语言模型的原理发展与应用》:此文为AI自动生成 一、引言:大语言模型,AI 时代的 “新引擎” 在当今数字化浪潮中,大语言模型宛如一颗璀璨的明星,照亮了人工智能发展的道路,成为推动各领域变革的核心驱…...
FPGA 高速接口Aurora8B/10B 协议详解与仿真
FPGA 高速接口Aurora8B/10B 协议详解与IP仿真 1 摘要 Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可…...
大白话Vue 源码
大白话Vue 源码 整体介绍 Vue 源码就像是一个超厉害的“魔法工具箱”,它能帮咱们轻松地做出各种漂亮又好用的网页。这个工具箱里有好几个关键的“魔法道具”,分别是响应式系统、虚拟 DOM、模板编译、组件系统和生命周期钩子,下面咱一个一个…...
grpc工具使用
工具安装 protoc 访问protoc release,根据系统型号,下载对应版本的protoc工具,并将下载到的可执行文件存放于$path中 安装完成后,可通过protoc --version指令校验是否安装成功 protoc --version # 输出: # libprotoc…...
ESP8266连接网络实时上传数据
要实现这个功能,可以按照以下步骤进行编程。我们将使用Arduino IDE来编写代码,并结合ESP8266的WiFi库、MQTT库以及Web服务器库来实现。 1. 准备工作 硬件:ESP8266开发板、温度传感器(如DS18B20)、显示屏(如OLED)。软件:Arduino IDE、ESP8266库、PubSubClient库(MQTT)…...
【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘
摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…...
定制化开发的WooCommerce独立站商城更安全
定制化开发的WooCommerce独立站商城在安全性、交易风险控制以及整体用户体验方面有显著优势。以下是定制化开发在这些方面的具体表现: 1. 安全性更高 定制化开发允许开发者从底层架构开始设计和优化,确保网站的安全性。以下是具体表现: (1…...
AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增
电网系统覆盖幅员辽阔,每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点,亟需智能化工具的突破性革新。为了满足这一需求,遨游通讯推出AORO P9000 PRO三防平板,以…...
游戏引擎学习第135天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中,不使用任何现成的游戏引擎或第三方库,而是直接基于 Windows 进行开发,因为 Windows 目前仍然是游戏的标准平台,因此首先在这个环境中进行…...
安全渗透测试的全面解析与实践
引言 随着网络安全威胁的日益增加,企业和组织对自身系统的安全性提出了更高的要求。安全渗透测试(Penetration Testing,简称渗透测试)作为主动发现和修复系统安全漏洞的重要手段,已成为安全防护体系中的关键环节。本文…...
关联封号率降70%!2025最新IP隔离方案实操手册
高效运营安全防护,跨境卖家必看的风险规避指南 跨境账号管理的核心挑战:关联封号风险激增 2024年,随着全球电商平台对账号合规的审查日益严苛,“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…...
【深度学习CV】【图像分类】从CNN(卷积神经网络)、ResNet迁移学习到GPU高效训练优化【案例代码】详解
摘要 本文分类使用的是resNet34,什么不用yolo v8,yolo v10系列,虽然他们也可以分类,因为yolo系列模型不纯粹,里面包含了目标检测的架构,所以分类使用的是resNet 本文详细介绍了三种不同的方法来训练卷积神经网络进行 CIFAR-10 图…...
【Java基础-51.5】字节流与字符流的转换:Java I/O 中的桥梁
在 Java 的 I/O 操作中,字节流和字符流是两种常见的数据处理方式。字节流以字节为单位进行读写,适合处理二进制数据(如图片、音频等);而字符流以字符为单位进行读写,适合处理文本数据。在实际开发中&#x…...
如何设置爬虫的访问频率?
设置爬虫的访问频率是确保爬虫行为合法且不给目标网站服务器造成过大压力的重要措施。合理的访问频率可以有效避免被网站封禁IP,同时也能保证爬虫的效率。以下是一些设置爬虫访问频率的方法和策略: 一、设置请求间隔 (一)固定间隔…...
如何排查服务器内存泄漏问题
服务器内存泄漏是一种常见的问题,可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤: 排查服务器内存泄漏问题的步骤: 监控系统资源: 使用系统监控工具(如top、htop、free&#x…...
Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器
Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器 打开终端,下载谷歌浏览器软件包: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行: sudo…...
有关Java中的集合(1):List<T>和Set<T>
学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点:有序表示存取有序(因为有索引)而且可以重复 ● List常用实现类: ArrayList、LinkedList、Vector等 1.1 常用方法…...
【C++STL之vector】vector容器浅析
文章目录 🌟 深入探索C vector:从青铜到王者的动态数组进阶指南 🌟🚀 开篇:为什么vector是C程序员的瑞士军刀?🔍 一、vector的本质解密:不只是智能数组那么简单1.1 动态数组的华丽蜕…...
如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?
目录 1. CNN 提取图像局部特征的原理 2. 在 CIFAR - 10 数据集上实现高精度分类的步骤 2.1 数据准备 2.2 构建 CNN 模型 2.3 定义损失函数和优化器 2.4 训练模型 2.5 测试模型 3. 提高分类精度的技巧 卷积神经网络(Convolutional Neural Network, CNN&#…...
Redis的持久化-RDBAOF
文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。 …...
Redis 的几个热点知识
前言 Redis 是一款内存级的数据库,凭借其卓越的性能,几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识,但其中的热点知识并不多。今天,『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…...
Rust WebAssembly 入门教程
一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】
目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具,便于在客户端软件中…...
Android 中 ConstrantLayout 与 RelativeLayout 区别
ConstraintLayout 和 RelativeLayout 都是 Android 开发中常用的布局容器,它们都可以用于构建复杂的用户界面,但在功能、性能、使用方式等方面存在一些区别,下面为你详细介绍: 1. 布局原理 RelativeLayout:RelativeL…...
【3DMAX室内设计】2D转3D平面图插件2Dto3D使用方法
【一键筑梦】革新性2Dto3D插件,轻松实现2D平面图向3D空间的华丽蜕变。这款专为3DMAX室内设计师设计的神器,集一键式墙体、门、窗自动生成功能于一身,能够将2D图形无缝转化为3D网格对象(3D平面图、鸟瞰图),一…...
vscode 查看3d
目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件: 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程:开始是绿屏,过了1到2秒,后来就正常看了。 2. vsc…...
自动驾驶---不依赖地图的大模型轨迹预测
1 前言 早期传统自动驾驶方案通常依赖高精地图(HD Map)提供道路结构、车道线、交通规则等信息,可参考博客《自动驾驶---方案从有图迈进无图》,本质上还是存在问题: 数据依赖性高:地图构建成本昂贵…...
perl初试
我手头有一个脚本,用于从blastp序列比对的结果文件中,进行文本处理, 获取序列比对最优的hit记录 #!/usr/bin/perl -w use strict;my ($blast_out) ARGV; my $usage "This script is to get the best hit from blast output file wit…...
