之前打印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. ajax发送请求的时候url为空或者undefined会发生什么

    $.ajax()里的url为空,ajax请求发送到当前自己的页面. 例如index.html里$.ajax()的url为空就发送到index.html

  2. Redux异步解决方案之Redux-Thunk原理及源码解析

    前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...

  3. 想要使用GPU进行加速?那你必须事先了解CUDA和cuDNN

    这一期我们来介绍如何在Windows上安装CUDA,使得对图像数据处理的速度大大加快,在正式的下载与安装之前,首先一起学习一下预导知识,让大家知道为什么使用GPU可以加速对图像的处理和计算,以及自己的 ...

  4. Azure Storage 系列(四)在.Net 上使用Table Storage

    一,引言 今天我们就不多说废话了,直接进入正题,Azure Table Storage.开始内容之前,我们先介绍一下Azure Table Storage. 1,什么是Azure Table Stor ...

  5. CVE-2020-0796(永恒之黑)漏洞复现

    声明:仅供学习与参考,请勿用于非法用途(后果自负) 一.影响范围(需关闭 Win10 防火墙): Windows 10 Version 1903 for 32-bit Systems Windows ...

  6. Apache 和 Nginx 下绑定域名

    Apache 方法一 参考:链接 版本:2.3 配置文件位置:/usr/share/doc/httpd/httpd-vhosts.conf 添加域名和站点信息: vim /usr/share/doc/ ...

  7. windows-android-appium环境搭建

    一.安装jdk 安装jdk1.7以上版本,会生成一个jdk目录,和单独的jre目录(注意:不是jdk里面的jre,时安装过程中设置的那个jre路径)安装完成后并配置环境变量 在系统环境变量中,新建:J ...

  8. flask提交表单验证不通过,以及CSRF攻击原理

    学习表单的问题1. 提交表单时怎么都无法验证通过 记录一下,自己的学习bug,主要是因为在模板中书写渲染的语句时,把CSRF的字段名写错了. 因为在模板中书写一些语句是没有提示的,自己手动敲代码容易出 ...

  9. 最全 IT 相关网站,软件开发网站收集

    前端比较流行的 UI 框架 目前前端用的比较多的框架有如下几个 Ant Design:Ant Design - 一套企业级 UI 设计语言和 React 组件库  Mint UI:https://mi ...

  10. 本机ping不通虚拟机,但虚拟机可以ping通本机时怎么解决

    在各自网络都连接的情况下,本机ping不通虚拟机,但虚拟机可以ping通本机时解决方案: 1.linux虚拟机中连接方式选择NAT模式 2.本地启动VMnet8,然后选择VMnet8的属性,手动输入和 ...