之前打印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. ElasticSearch7.6.1 概述

    本来打算重新回去看 并发编程的,之前看过一遍,现在基本忘完了,然后因为考虑到项目的需要,就先看ES了 然后再B站上看到一个视屏比较火,就看这个吧 给大家推荐一下 https://www.bilibil ...

  2. (Python)正则表达式进行匹配

    import os import re pattern=re.compile(r'(\d{4})-(\d{2})-(\d{2})-b(\d{3})') // 要匹配的目录格式 for root,dir ...

  3. Fastbin attack——Double Free

    ptmalloc ptmalloc的基本思路是将堆上的内存区域划分为多个chunk,在分配/回收内存时,对chunk进行分割.回收等操作.在32位系统下,chunk头的大小为8 Bytes,且每个ch ...

  4. pwnable.kr之flag

    拿到文件,先运行一下,输出: I will malloc() and strcpy the flag there. take it. 用python查看文件是否有什么保护, Arch: amd64-- ...

  5. 企业网站还是要考虑兼容至少IE10

    中国国情,大部分企业还在使用win7,IE浏览器.为了兼容这些,还是少用比较VUE等一些高级的框架,改为使用jquery.用惯了VUE,jquey好多忘得差不多了,其中遇到的问题及解决方案 ajax, ...

  6. jmeter中接口测试出现乱码或不识别中文解决办法

    在查看结果是中出现乱码时:jmeter的bin目录下的jmeter.properties下最下面添加sampleresult.default.encoding=UTF-8后重新打开工具就好了 在接口的 ...

  7. 记录一次OCR程序开发的尝试

    记录一次OCR程序开发的尝试 最近工作中涉及到一部分文档和纸质文档的校验工作,就想把纸质文件拍下来,用文字来互相校验.想到之前调用有道智云接口做了文档翻译.看了下OCR文字识别的API接口,有道提供了 ...

  8. Linux驱动之GPIO子系统和pinctrl子系统

    前期知识   1.如何编写一个简单的Linux驱动(一)--驱动的基本框架   2.如何编写一个简单的Linux驱动(二)--设备操作集file_operations   3.如何编写一个简单的Lin ...

  9. docker的使用场景和背景了解

    Docker的使用场景以及优缺点 https://blog.csdn.net/zhangdekui/article/details/81541519 浅析Docker容器的应用场景 https://w ...

  10. java基础整理总结篇(1)

    >>java数据区域,大致分以下几种 寄存器:位于cpu内部,寄存器的数量有限,所以寄存器根据需求分配.不能直接控制它. 堆栈:位于通用RAM(随机访问存储器)中,通过堆栈指针可以从处理器 ...