之前打印PDF都是通过html形式来实现的,但是这次要做的东西,需要打印界面控件,所以需要使用QPdfWriter.

通过QPdfWriter来获取QPainter对象,就能实现在PDF上来画画啦.

代码生成的PDF如下所示:

代码效果如下所示:

代码如下所示:

//通过dialog来保存PDF路径
QString mainWindow::pdfSaveAs(QString fileName)
{
QString file=""; file = QFileDialog::getSaveFileName (
this, //父组件
"另存为", //标题
QString("%1/%2").arg(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).arg(""+fileName+".pdf"),
//设置路径, .表示当前路径,./表示更目录
"PDF文件", //过滤器,保存的类型
Q_NULLPTR,
QFileDialog::ShowDirsOnly); return file;
} //y:表单的Y坐标
//horzBorder:水平外边距,写0表示没有边距
//row,column:行数和列数
//unitHeight:单元高度
//font:字体大小
//list:要写入的单元数据
void mainWindow::pdfDrawForm(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;
} } void mainWindow::pdfCreate(checkInfo &info)
{ // //设置pdf保存的路径
// QString file_path = pdfSaveAs(QString("表单%1").arg(QDateTime::currentDateTime().toString("MMdd-hh-mm")));
// if(file_path.isEmpty())
// return; QString file_path =QApplication::applicationDirPath()+"/test.pdf";
QFile pdfFile(file_path);
pdfFile.open(QIODevice::WriteOnly);
QPdfWriter* pWriter = new QPdfWriter(&pdfFile); //Init Page
pWriter->setPageSize(QPagedPaintDevice::A4);
pWriter->setResolution(300); //设置dpi 每个平方英寸像素为300
pWriter->setPageMargins(QMarginsF(30, 30, 30, 30)); QPainter* pPainter = new QPainter(pWriter); //Init Font
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); //Painter PDF
qDebug()<<pPainter->viewport();
int nPDFWidth = pPainter->viewport().width();
int nPDFHeight = pPainter->viewport().height(); //在10%的头部居中显示
int y=10;
pPainter->setFont(font[0]);
pPainter->drawText(QRect(0,y, nPDFWidth, 100), Qt::AlignCenter,
m_arg.printTitle);
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(info.dev.name)); pPainter->setFont(font[2]);
pPainter->drawText(QRect(nPDFWidth/2+100,y, nPDFWidth/2-100, 70), Qt::AlignVCenter | Qt::AlignLeft,
QString("器件编号: %1").arg(info.devNum)); y+=90; pPainter->setFont(font[2]);
pPainter->drawText(QRect(100,y, nPDFWidth/2, 70), Qt::AlignVCenter | Qt::AlignLeft,
QString("装车车号: %1").arg(info.devCar)); pPainter->setFont(font[2]);
pPainter->drawText(QRect(nPDFWidth/2+100,y, nPDFWidth/2-100, 70), Qt::AlignVCenter | Qt::AlignLeft,
QString("试验日期: %1").arg(info.checkDate)); y+=110; pPainter->setFont(font[1]);
pPainter->drawText(QRect(0,y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft,
"减 振 器 标 准 参 数"); y+=120; QStringList list;
list<<"速度"<<"压力"<<"拉力"<<"阻尼系数"<<"不对称率"<<"正允差"<<"负允差";
list<<info.dev.speed+"m/s"<<info.dev.yaLi+"kN"<<info.dev.laLi+"kN"<<\
info.dev.zhuNi+"kNs/m"<<info.dev.buDuiC+"%"<<info.dev.zYunCha+"%"<<info.dev.fYunCha+"%";
pdfDrawForm(pPainter,y,0,2,7,100,font[3],list); y+=260; pPainter->setFont(font[1]);
pPainter->drawText(QRect(0,y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft,
"示 功 图");
y+=100; //获取界面图片
int imageBorder=150; //设置图片水平边距为150 QPixmap pixmap = QPixmap::grabWidget(m_checkChart, m_checkChart->rect()); float x = (float)(nPDFWidth-imageBorder*2)/(float)pixmap.width(); pixmap= pixmap.scaled(nPDFWidth-imageBorder*2, x*pixmap.height(),Qt::IgnoreAspectRatio); //根据大小比例,来放大缩小图片 pPainter->drawPixmap(imageBorder, y, pixmap); y+=pixmap.height()+90; pPainter->setFont(font[1]);
pPainter->drawText(QRect(0,y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft,
"减 振 器 测 试 结 果"); y+=120; list.clear();
list<<"拉伸行程:"<<QString::asprintf("%.2fmm",info.laSheng)<<"压缩行程:"<<QString::asprintf("%.2fmm",info.yaSuo)<<"最大速度:"<<QString::asprintf("%.3fm/s",info.speed)<<"阻尼系数:"<<QString::asprintf("%.2fkNs/m",info.speed)
<<"最大压力:"<<QString::asprintf("%.2fkN",info.max)<<"压力偏差:"<<QString::asprintf("%.2f%",info.maxBaiFengb)<<"最大拉力:"<<QString::asprintf("%.2fkN",info.min)<<"拉力偏差:"<<QString::asprintf("%.2f%",info.minBaiFengb)
<<"不对称率:"<<QString::asprintf("%.2f%",info.buduic)<<"运行时间:"<<QString::asprintf("%dS",info.runDate)<<"试验结果:"<<info.result<<"曲线结论:"<<info.ChartResult;
pdfDrawForm(pPainter,y,0,3,8,100,font[3],list); y+=400; pPainter->setFont(font[4]);
pPainter->drawText(QRect(50,y, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft,
QString( "试验员: %1").arg(m_userLoginInfo->name)); pPainter->drawText(QRect(nPDFWidth/3+50,y, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft,
QString( "检查员签字: ")); pPainter->drawText(QRect(nPDFWidth/3*2,y, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft,
QString( "签字日期: ")); // pWriter->newPage(); //写下一页 //绘制完毕
delete pPainter;
delete pWriter;
pdfFile.close(); //通过其它PDF阅读器来打开PDF
QDesktopServices::openUrl(QUrl::fromLocalFile(file_path));
}

53.Qt-QPdfWriter绘制PDF,支持表单输出的更多相关文章

  1. Java导出Pdf格式表单

    前言   作为开发人员,工作中难免会遇到复杂表单的导出,接下来介绍一种通过Java利用模板便捷导出Pdf表单的方式 模拟需求   需求:按照下面格式导出pdf格式的学生成绩单 准备工作 Excel软件 ...

  2. [原创]Web前端开发——让ie 7 8支持表单的placeholder属性

    今天在写页面的时候,测试低版本浏览器时,发现input写的placeholder显示的是空白,所以特意写了一个普遍试用的方法来让低版本浏览器支持这个属性. 博主建了一个技术共享qq群:,因为目前人数还 ...

  3. Bootstrap3 表单-输出内联表单

    为 <form> 元素添加 .form-inline 类可使其内容左对齐并且表现为 inline-block 级别的控件.只适用于视口(viewport)至少在 768px 宽度时(视口宽 ...

  4. 黄聪:Pjax无刷新跳转页面实现,支持超链接与表单提交

    什么是pjax? 当你点击一个站内的链接的时候,不是做页面跳转,而是只是站内页面刷新.这样的用户体验,比起整个页面都闪一下来说, 好很多. 其中有一个很重要的组成部分, 这些网站的ajax刷新是支持浏 ...

  5. Pjax无刷新跳转页面实现,支持超链接与表单提交

    什么是pjax? 当你点击一个站内的链接的时候,不是做页面跳转,而是只是站内页面刷新.这样的用户体验,比起整个页面都闪一下来说, 好很多. 其中有一个很重要的组成部分, 这些网站的ajax刷新是支持浏 ...

  6. 让Angular自定义组件支持form表单验证

    Angular提供了一套非常强大的表单验证库(vue和react都需要第三方库的支持),可以非常方便简单实现web应用程序中的表单验证功能.但是如何让我们自定义的组件也支持验证呢? 我遇到一个需求是封 ...

  7. Bootstrap学习笔记系列3-------Bootstrap简单表单显示

    表单布局 垂直或基本表单 基本的表单结构时BootStrap自带的,创建基本表单的步骤如下: 向父<form>元素添加role = "form": 为了获取最佳的间距, ...

  8. 推荐几款很棒的 JavaScript 表单美化和验证插件

    表单元素让人爱恨交加.作为网页最重要的组成部分,表单几乎无处不在,从简单的邮件订阅.登陆注册到复杂的需要多页填写的信息提交功能,表单都让开发者花费了大量的时间和精力去处理,以期实现好用又漂亮的表单功能 ...

  9. 将form表单元素转为实体对象 或集合 -ASP.NET C#

    简介: 做WEBFROM开发的同学都知道后台接收参数非常麻烦 虽然MVC中可以将表单直接转为集实,但不支持表单转为 LIST<T>这种集合 单个对象的用法: 表单: <input n ...

随机推荐

  1. Java获取CPU序列号

    获取CPU序列号 /** * 获取CPU序列号 * @return */ public static String getCpuId() throws IOException { Process pr ...

  2. SqlAnalyzer1.00源码

    SQL解析的夙愿今天终于完成,但限于SQL远超算术表达式,Json,XML等的复杂度,只是解析了一部分.形成普适性的SQL解析,仍需倾注精力. 代码下载:https://files.cnblogs.c ...

  3. ubuntu安装docker-ce 、docker-ce-cli、containerd.io

    问题 ubuntu安装docker的时候特别慢,百度搜了一大堆都没讲到点子上,最后请教了大佬才知道是源的问题 安装 修改源 sudo gedit /etc/apt/sources.list 添加源 阿 ...

  4. C Primer Plus 学习笔记

    随笔: 1)C语言中%3d%2d什么意思? 格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式.在"%"和字母之间插进数字表示最大场 ...

  5. 你想了解的分布式文件系统HDFS,看这一篇就够了

    1.分布式文件系统 计算机集群结构 分布式文件系统把文件分布存储到多个节点(计算机)上,成千上万的计算机节点构成计算机集群. 分布式文件系统使用的计算机集群,其配置都是由普通硬件构成的,与用多个处理器 ...

  6. maven-shade-plugin插件未生效原因分析

    今天在项目的pom文件中引入maven-shade-plugin插件,构建一个uber-jar(包含所有依赖的jar包),但是诡异的事情出现了,执行mvn package后生成的jar包竟然没有包含被 ...

  7. JVM运行时数据区--方法区

    运行时数据区结构图(温习): 堆.栈.方法区的交互关系 方法区的理解 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域 方法区在JVM启动时就会被创建,并且它的实际的物理内存 ...

  8. Spark Pipeline官方文档

    ML Pipelines(译文) 官方文档链接:https://spark.apache.org/docs/latest/ml-pipeline.html 概述 在这一部分,我们将要介绍ML Pipe ...

  9. Spark Driver Program剖析

    SparkContext是通往Spark集群的唯一入口,是整个Application运行调度的核心. 一.Spark Driver Program Spark Driver Program(以下简称D ...

  10. CAS导致的ABA问题以及解决方案

    CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化. 上篇文章讲到CAS会出现一个ABA问题.那什么是ABA问题呢? 官方一点的解释就是:当 ...