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

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 安装全攻略:从入门到精通

目录 一&#xff1a;安装文件夹准备 1.打开&#xff0c;/home/admin目录 2.新建三个文件夹 二&#xff1a;安装tomcat 1.打开tomcat目录进行tomcat安装 2.解压tomcat文件 3.开放端口号 4.启动tomcat 5.浏览器访问tomcat 三&#xff1a;安装Maven 1.打开maven目录进行…...

迎重阳,话养老:平安养老险如何助力国民“养老梦”?

10月23日&#xff0c;我们将迎来传统节日重阳节&#xff0c;又称敬老节&#xff0c;自古就有祭祖、登高、赏菊三大风俗&#xff0c;流传至今&#xff0c;已成为人们孝老敬老的重要节日。 随着老龄化日益加深&#xff0c;在“敬老”的同时如何“备老”成为人民群众长期热议的话题…...

微信小程序获取用户信息

个人博客 微信小程序获取用户信息 个人微信公众号&#xff0c;求关注&#xff0c;求收藏&#xff0c;求指错。 文章概叙 本文主要讲的是小程序获取用户信息的&#xff0c;更新测试时间是2023-10-25 更改原因 首先&#xff0c;官网上的解释是这样的&#xff0c;为了安全合…...

Mysql 索引原理和优化方式

一、索引原理 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。可以联想到字典中的目录。 索引的分类 &#xff08;1&#xff09; Hash 索引 Hash 索引是比较常见的一种索引&#xff0c;他的单条记录查询的效率很高&#xff0c;时间复杂度为1。但是&#xff0c…...

Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题

1&#xff1a;首先使用VMware Workstation安装一个Ubuntu的系统。 2&#xff1a;现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3&#xff1a;进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4&#xff1a;提示下面错误&#xff0c;Package open-vm…...

【Docker】Docker Swarm介绍与环境搭建

为什么不建议在生产环境中使用Docker Compose 多机器如何管理&#xff1f;如何跨机器做scale横向扩展&#xff1f;容器失败退出时如何新建容器确保服务正常运行&#xff1f;如何确保零宕机时间&#xff1f;如何管理密码&#xff0c;Key等敏感数据&#xff1f; Docker Swarm介…...

国产CAN总线收发芯片DP1042 兼容替换TJA1042

说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片&#xff0c;可应用于卡车、公交、小汽车、工业控制等领域&#xff0c;支持 5Mbps CAN FD 灵活数据速率&#xff0c;具有在总线与 CAN 协议控制器之间进行差分信号传输的能力&#xff0c;完全兼容“ISO…...

[架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构

目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图&#xff0c;是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 …...

【接口技术】定时计数器习题

1&#xff1a;8253芯片有______个端口地址。 【可选】 2 3 4 6 解答&#xff1a;4 2&#xff1a;8253芯片有______种工作方式。 【可选】 3 4 5 6 解答&#xff1a;6 3&#xff1a; 8253芯片内部有完全独立的______。 【可选】 6个16位计数通道 3个16位计数通道 6个8位计…...

DC电源模块的的散热结构合理布局

BOSHIDA DC电源模块的的散热结构合理布局 DC电源模块在工业控制、通讯、汽车电子等领域广泛应用。然而&#xff0c;随着功率密度不断提高&#xff0c;DC电源模块产生的热量也越来越大&#xff0c;散热问题变得越来越突出。为了保障电路的稳定性和可靠性&#xff0c;必须采取合…...

Fedora Linux 38下安装音频与视频的解码器和播放器

Fedora Linux 38 操作系统安装好后&#xff0c;默认是没有音频与视频的解码器的&#xff0c;音频与视频的播放体验非常差劲。但是第三方的软件源中有解码器和播放器的软件&#xff0c;需要我们自己手动安装。、 连接互联网&#xff0c;打开Shell命令行&#xff1a; 1. sudo d…...

边缘计算:云计算的延伸

云计算已经存在多年&#xff0c;并已被证明对大大小小的企业都有好处&#xff1b;然而&#xff0c;直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理&#xff0c;更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…...

【经验分享】在Kylin桌面版操作系统中配置openGauss的ODBC数据源

引言 openGauss是一款开源的关系型数据库管理系统&#xff0c;它提供了强大的功能和性能&#xff0c;可以满足各种企业级应用的需求。与此同时&#xff0c;ODBC&#xff08;Open Database Connectivity&#xff09;是一个标准的数据库访问接口&#xff0c;它允许应用程序通过统…...

WSL——ubuntu中anaconda换源(conda、pip)

1、conda 打开Ubuntu&#xff0c;输入下列命令。 conda config --set show_channel_urls yes 在文件管理器地址栏&#xff0c;输入&#xff1a;\\wsl$。打开Ubuntu根路径&#xff0c;其中显示了.condarc文件。 以文本形式打开&#xff0c;并输入要换的源&#xff0c;保存即可。…...

IP地址在网络安全中的关键作用

IP地址&#xff08;Internet Protocol Address&#xff09;是互联网世界中的重要标识符&#xff0c;它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此&#xff0c;还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…...

Android.mk 中覆盖应用包名

项目场景&#xff1a; 一般来讲应用包名都是配置在 AndroidManifest.xml 中的&#xff0c;但遇到特殊情况&#xff0c;需要修改源码中应用包名 通常都会先去改 AndroidManifest.xml package 但改为后编译发现一顿错误&#xff0c;原因是 java 类中已经指定了 R 文件包名&…...

如何最有效地使用ChatGPT:提问技巧与策略

前言 在如今信息技术高速发展的时代&#xff0c;像ChatGPT这样的大型自然语言处理模型为我们提供了一个强大的工具&#xff0c;以获取各种信息和答案。然而&#xff0c;要充分利用这一工具&#xff0c;您需要掌握一些提问技巧与策略&#xff0c;以确保获得最准确和有用的回答。…...

【JAVA学习笔记】40 - 抽象类、模版设计模式(抽象类的使用)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/abstract_ 一、抽象类的引入 很多时候在创建类的时候有一个父类&#xff0c;比如animal类&#xff0c;他的子类会有各种方法&#xff0c;为了复用需要进行方法的重写&…...

如何通过在线培训考试系统进行远程教育

随着互联网技术的不断发展&#xff0c;远程教育正在成为一种新型的学习方式&#xff0c;它使学生能够在任何地点、任何时间通过在线培训考试系统接受教育。 利用在线培训考试系统进行远程教育具有很大的灵活性。学生可以根据自己的时间和需求自由选择课程&#xff0c;无需受制…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...