Qt生成PDF报告
文章目录
- 一、示意图
- 二、实现部分代码
- 总结
一、示意图


二、实现部分代码
//! 生成测试报告
void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err)
{//QDir dir;if(!dir.exists("PdfFiles")) qDebug()<<dir.mkdir("PdfFiles");//创建PDF文件QString file_path = filename;QFile pdfFile(file_path);bool isOpen = pdfFile.open(QIODevice::WriteOnly);if(!isOpen){QMessageBox::warning(this,"error", pdfFile.errorString());return;}QPdfWriter *pWriter = new QPdfWriter(&pdfFile);pWriter->setPageSize(QPagedPaintDevice::A4);pWriter->setResolution(300);pWriter->setPageMargins(QMarginsF(30, 30, 30, 30));QPainter *pPainter = new QPainter(pWriter);QFont font[5] = {QFont("宋体", 26, 60), QFont("宋体", 26, 61), QFont("宋体", 26, QFont::Normal), QFont("宋体", 26, QFont::Normal), QFont("宋体", 26, QFont::Normal)};font[0].setPixelSize(86);font[1].setPixelSize(61);font[2].setPixelSize(61);font[3].setPixelSize(42);font[4].setPixelSize(54);//qDebug()<<pPainter->viewport().width()<<" "<<pPainter->viewport().height();int nPDFWidth = pPainter->viewport().width();int nPDFHeight = pPainter->viewport().height();//标题int y = 10;pPainter->setFont(font[0]);pPainter->drawText(QRect(0, y, nPDFWidth, 100), Qt::AlignCenter, msg.title);//画两条横线y += 140;pPainter->setPen(QPen(QBrush(QColor(0, 0, 0)), 5));pPainter->drawLine(0, y, nPDFWidth, y);pPainter->drawLine(0, y + 18, nPDFWidth, y + 18);//y += 60;pPainter->setFont(font[2]);pPainter->drawText(QRect(100, y, nPDFWidth/2, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("产品名称: %1").arg(msg.product_name));pPainter->drawText(QRect(nPDFWidth/2 + 100 , y, nPDFWidth/2 - 100, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("产品ID: %1").arg(msg.product_id));y += 90;pPainter->drawText(QRect(100, y, nPDFWidth/2, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("产品型号: %1").arg(msg.product_type));pPainter->drawText(QRect(nPDFWidth/2 + 100 , y, nPDFWidth/2 - 100, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("测试时间: %1").arg(msg.test_time));//小标题y += 90;pPainter->setFont(font[1]);pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft, "触点比较结果");//画表格y += 110;QStringList list;list<<"序号"<<"输出点位名称"<<"结果"<<"序号"<<"输出点位名称"<<"结果";//int idx = 1;int row = 0;int column = 0;if(caseType == CASETYPE::L3U){foreach(QString s, g_RelayContact_3U){if(s == "预留") list<<QString::number(idx)<<s<<"";else if(err.contains(s)) list<<QString::number(idx)<<s<<"不合格";else if(ok.contains(s)) list<<QString::number(idx)<<s<<"合格";else list<<QString::number(idx)<<s<<"未检测";++idx;}row = g_RelayContact_3U.length()/2+1;column = 6;}else{foreach(QString s, g_RelayContact_6U){if(s == "预留") list<<QString::number(idx)<<s<<"";else if(err.contains(s)) list<<QString::number(idx)<<s<<"不合格";else if(ok.contains(s)) list<<QString::number(idx)<<s<<"合格";else list<<QString::number(idx)<<s<<"未检测";++idx;}row = g_RelayContact_6U.length()/2+1;column = 6;}pdfDrawForm(pWriter, pPainter, y, 0, row, column, 80, font[3], list);//!//小标题y += 90;pPainter->setFont(font[1]);pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft, "不合格点位");////画表格y += 110;list.clear();list<<"序号"<<"输出点位名称"<<"结果"<<"序号"<<"输出点位名称"<<"结果";//idx = 1;row = 0;column = 0;if(caseType == CASETYPE::L3U){for(auto it = err.begin(); it != err.end(); ++it){list<<QString::number(it.value())<<it.key()<<"不合格";}row = err.size()/2+1;column = 6;}else{for(auto it = err.begin(); it != err.end(); ++it){list<<QString::number(it.value())<<it.key()<<"不合格";}row =err.size()/2+1;column = 6;}pdfDrawForm(pWriter, pPainter, y, 0, row, column, 80, font[3], list);//pPainter->setFont(font[4]);pPainter->drawText(QRect(50, nPDFHeight, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft, QString( "试验员: %1").arg(msg.tester_name));pPainter->drawText(QRect(nPDFWidth/3+50, nPDFHeight, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft, QString( "检查员签字: "));pPainter->drawText(QRect(nPDFWidth/3*2, nPDFHeight, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft, QString( "签字日期: "));//绘制完毕delete pPainter;delete pWriter;pdfFile.close();//通过其他PDF阅读器来打开PDFQDesktopServices::openUrl(QUrl::fromLocalFile(file_path));
}
void MainWindow::pdfDrawForm(QPdfWriter *pWriter, QPainter *paint, int& y, int horzBorder, int row, int column, int unitHeight, QFont &font, QStringList &list)
{paint->setFont(font);paint->setPen(QPen(QBrush(QColor(0, 0, 0)), 2));int Width = paint->viewport().width() - horzBorder * 2;int unitWidth = Width / column;for(int i=0;i<row;i++) {int x = horzBorder;for(int j=0;j<column;j++) {paint->drawText(QRect(x, y, unitWidth, unitHeight), Qt::AlignCenter, list[i*column + j]);paint->drawRect(QRect(x, y, unitWidth, unitHeight));x += unitWidth;}y += unitHeight;if(y > paint->viewport().height()){pWriter->newPage();y = 10;}}
}
总结
记录下用到的不常用知识点
相关文章:
Qt生成PDF报告
文章目录 一、示意图二、实现部分代码总结 一、示意图 二、实现部分代码 //! 生成测试报告 void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err) {//QDir dir;if(!dir.exis…...
Jenkins 安装全攻略:从入门到精通
目录 一:安装文件夹准备 1.打开,/home/admin目录 2.新建三个文件夹 二:安装tomcat 1.打开tomcat目录进行tomcat安装 2.解压tomcat文件 3.开放端口号 4.启动tomcat 5.浏览器访问tomcat 三:安装Maven 1.打开maven目录进行…...
迎重阳,话养老:平安养老险如何助力国民“养老梦”?
10月23日,我们将迎来传统节日重阳节,又称敬老节,自古就有祭祖、登高、赏菊三大风俗,流传至今,已成为人们孝老敬老的重要节日。 随着老龄化日益加深,在“敬老”的同时如何“备老”成为人民群众长期热议的话题…...
微信小程序获取用户信息
个人博客 微信小程序获取用户信息 个人微信公众号,求关注,求收藏,求指错。 文章概叙 本文主要讲的是小程序获取用户信息的,更新测试时间是2023-10-25 更改原因 首先,官网上的解释是这样的,为了安全合…...
Mysql 索引原理和优化方式
一、索引原理 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。可以联想到字典中的目录。 索引的分类 (1) Hash 索引 Hash 索引是比较常见的一种索引,他的单条记录查询的效率很高,时间复杂度为1。但是,…...
Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题
1:首先使用VMware Workstation安装一个Ubuntu的系统。 2:现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3:进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4:提示下面错误,Package open-vm…...
【Docker】Docker Swarm介绍与环境搭建
为什么不建议在生产环境中使用Docker Compose 多机器如何管理?如何跨机器做scale横向扩展?容器失败退出时如何新建容器确保服务正常运行?如何确保零宕机时间?如何管理密码,Key等敏感数据? Docker Swarm介…...
国产CAN总线收发芯片DP1042 兼容替换TJA1042
说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片,可应用于卡车、公交、小汽车、工业控制等领域,支持 5Mbps CAN FD 灵活数据速率,具有在总线与 CAN 协议控制器之间进行差分信号传输的能力,完全兼容“ISO…...
[架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构
目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图,是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 …...
【接口技术】定时计数器习题
1:8253芯片有______个端口地址。 【可选】 2 3 4 6 解答:4 2:8253芯片有______种工作方式。 【可选】 3 4 5 6 解答:6 3: 8253芯片内部有完全独立的______。 【可选】 6个16位计数通道 3个16位计数通道 6个8位计…...
DC电源模块的的散热结构合理布局
BOSHIDA DC电源模块的的散热结构合理布局 DC电源模块在工业控制、通讯、汽车电子等领域广泛应用。然而,随着功率密度不断提高,DC电源模块产生的热量也越来越大,散热问题变得越来越突出。为了保障电路的稳定性和可靠性,必须采取合…...
Fedora Linux 38下安装音频与视频的解码器和播放器
Fedora Linux 38 操作系统安装好后,默认是没有音频与视频的解码器的,音频与视频的播放体验非常差劲。但是第三方的软件源中有解码器和播放器的软件,需要我们自己手动安装。、 连接互联网,打开Shell命令行: 1. sudo d…...
边缘计算:云计算的延伸
云计算已经存在多年,并已被证明对大大小小的企业都有好处;然而,直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理,更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…...
【经验分享】在Kylin桌面版操作系统中配置openGauss的ODBC数据源
引言 openGauss是一款开源的关系型数据库管理系统,它提供了强大的功能和性能,可以满足各种企业级应用的需求。与此同时,ODBC(Open Database Connectivity)是一个标准的数据库访问接口,它允许应用程序通过统…...
WSL——ubuntu中anaconda换源(conda、pip)
1、conda 打开Ubuntu,输入下列命令。 conda config --set show_channel_urls yes 在文件管理器地址栏,输入:\\wsl$。打开Ubuntu根路径,其中显示了.condarc文件。 以文本形式打开,并输入要换的源,保存即可。…...
IP地址在网络安全中的关键作用
IP地址(Internet Protocol Address)是互联网世界中的重要标识符,它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此,还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…...
Android.mk 中覆盖应用包名
项目场景: 一般来讲应用包名都是配置在 AndroidManifest.xml 中的,但遇到特殊情况,需要修改源码中应用包名 通常都会先去改 AndroidManifest.xml package 但改为后编译发现一顿错误,原因是 java 类中已经指定了 R 文件包名&…...
如何最有效地使用ChatGPT:提问技巧与策略
前言 在如今信息技术高速发展的时代,像ChatGPT这样的大型自然语言处理模型为我们提供了一个强大的工具,以获取各种信息和答案。然而,要充分利用这一工具,您需要掌握一些提问技巧与策略,以确保获得最准确和有用的回答。…...
【JAVA学习笔记】40 - 抽象类、模版设计模式(抽象类的使用)
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/abstract_ 一、抽象类的引入 很多时候在创建类的时候有一个父类,比如animal类,他的子类会有各种方法,为了复用需要进行方法的重写&…...
如何通过在线培训考试系统进行远程教育
随着互联网技术的不断发展,远程教育正在成为一种新型的学习方式,它使学生能够在任何地点、任何时间通过在线培训考试系统接受教育。 利用在线培训考试系统进行远程教育具有很大的灵活性。学生可以根据自己的时间和需求自由选择课程,无需受制…...
告别性能枷锁:Lenovo Legion Toolkit如何让游戏本释放真正潜力
告别性能枷锁:Lenovo Legion Toolkit如何让游戏本释放真正潜力 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit 在…...
BilibiliDown终极指南:快速上手B站视频下载器
BilibiliDown终极指南:快速上手B站视频下载器 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibi…...
小迪安全第9天:算法逆向与加密解密基础
一、加密算法分类与核心特征1.1 三大加密类型对比表格类型代表算法核心特点解密条件成功率单向散列加密MD5、SHA、MAC、CRC不可逆、固定输出、碰撞破解只需密文依赖明文复杂度对称加密AES、DES、3DES加解密用同一密钥、速度快密文密钥模式偏移量99.9%非对称加密RSA、SSL、PKCS公…...
实战解析:Element UI在Vue项目中的高效开发技巧
1. 为什么选择Element UI开发Vue项目 Element UI作为Vue生态中最受欢迎的UI组件库之一,在中后台管理系统开发中占据着不可替代的地位。我最早接触Element UI是在2018年开发一个电商后台系统时,当时对比了多个UI框架后,最终选择它的原因很简单…...
SAP SD不完整日志配置实战:从字段识别到测试全流程(含避坑指南)
SAP SD不完整日志配置实战:从字段识别到测试全流程(含避坑指南) 在SAP SD模块的实施与运维过程中,确保销售凭证数据的完整性是保障业务流程顺畅运行的基础。不完整日志功能作为数据质量的"守门人",能够有效预…...
别再傻傻格式化!RC522读不出NFC卡数据?试试这几组万能密钥(附Arduino代码)
RC522读卡失败急救指南:万能密钥库与自动破解方案 当你兴奋地将RC522模块连接到Arduino,准备读取NFC卡数据时,突然发现卡片无法识别——这种挫败感我深有体会。三年前我第一次接触RFID项目时,曾因为一张价值200元的工牌被"锁…...
Go 并发编程的常见陷阱
Go语言凭借轻量级协程和高效的并发模型,成为高并发场景的热门选择。其简洁的并发语法背后隐藏着诸多陷阱,稍有不慎就会引发数据竞争、死锁等问题。本文将剖析三个典型并发陷阱,帮助开发者避开暗礁,写出健壮的并发程序。**共享变量…...
新手福音:在快马平台免配置玩转jdk17,写出第一个java程序
作为一个Java新手,最头疼的往往不是写代码本身,而是配置开发环境。记得我刚开始学Java时,光是下载安装JDK、配置环境变量就折腾了大半天,还没开始写代码就已经被劝退了。直到发现了InsCode(快马)平台,才真正体会到什么…...
5个超实用网络转发技巧:用socat-windows解决90%的连接难题
5个超实用网络转发技巧:用socat-windows解决90%的连接难题 【免费下载链接】socat-windows unofficial windows build of socat http://www.dest-unreach.org/socat/ 项目地址: https://gitcode.com/gh_mirrors/so/socat-windows 在现代网络架构中࿰…...
微信聊天记录导出终极指南:免费工具WeChatExporter完整使用教程
微信聊天记录导出终极指南:免费工具WeChatExporter完整使用教程 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否担心珍贵的微信聊天记录会因手机更换或…...
