一、前言

近期用户提了个需求,需要打印一个文档,要求其中部分页横向排版部分页面纵向排版,这个在之前的通用打印导出pdf类中是不具备的,通用的打印导出pdf只能统一设置一个排版方式,要么横向要么纵向,而如果要指定某一页横向还是纵向,需要单独的处理。为什么之前设计的类不支持单独指定页面,主要是为了方便用户使用,并不需要复杂的设置,而且面对的应用场景都是统一的日志类、信息类,这些数据基本上要么统一是横向要么统一是纵向排版,不需要精确到某一页什么排版,而且传入数据内容集合以后是自动分页处理的,也无法动态切换排版方式。一般是特殊的报表内容才可能需要指定页不同的排版方式,比如医疗上面用的报表,个人信息纵向排版,体检信息中的心电图横向排版看到更清晰。

要实现指定页不同排版方式,需要用到QPdfWriter类,这个类是从Qt5.3开始有的,将QPainter类指定绘制对象为QPdfWriter类对象即可,然后通过函数setPageOrientation设置纸张的方向,调用newPage函数生成新的一页,自行控制分页和绘制内容,既然都已经是QPainter对象了,那就想要如何绘制都可以,画点画线画框,心中有坐标,万物皆painter。当然也支持QTextDocument构建好html内容传入,这样也非常丰富灵活。

二、功能特点

  1. 组件同时集成了导出数据到csv、xls、pdf和打印数据。
  2. 所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便。
  3. 同时支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等数据源。
  4. 提供静态方法直接传入QTableView、QTableWidget控件,自动识别列名、列宽和数据内容。
  5. 每组功能都提供单独的完整的示例,注释详细,非常适合各阶段Qter程序员。
  6. 原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,支持嵌入式linux。
  7. 速度超快,9个字段10万行数据只需要2秒钟完成。
  8. 只需要四个步骤即可开始急速导出海量数据比如100W条记录到Excel。
  9. 同时提供直接写入数据接口和多线程写入数据接口,不卡主界面。
  10. 可设置标题、副标题、表名。
  11. 可设置导出数据的字段名、列名、列宽。
  12. 可设置末尾列自动拉伸填充,默认拉伸更美观。
  13. 可设置是否启用校验过滤数据,启用后符合规则的数据特殊颜色显示。
  14. 可指定校验的列、校验规则、校验值、校验值数据类型。
  15. 校验规则支持 精确等于==、大于>、大于等于>=、小于<、小于等于<=、不等于!=、包含contains。
  16. 校验值数据类型支持 整型int、浮点型float、双精度型double,默认文本字符串类型。
  17. 可设置随机背景颜色及需要随机背景色的列集合。
  18. 支持分组输出数据,比如按照设备分组输出数据,方便查看。
  19. 可设置csv分隔符、行内容分隔符、子内容分隔符。
  20. 可设置边框宽度、自动填数据类型,默认自动数据类型开启。
  21. 可设置是否开启数据单元格样式,默认不开启,不开启可以节约大概30%的文件体积。
  22. 可设置横向排版、纸张边距等,比如导出到pdf以及打印数据。
  23. 提供图文混排导出数据到pdf以及打印示例,自动分页,支持多图。
  24. 提供一个打印样板中同时包括横向纵向排版示例。
  25. 提供静态函数将控件截图导出到pdf文件。
  26. 提供静态函数将图片转成pdf文件。
  27. 提供静态函数将csv文件转成xls文件,支持列宽表名等参数设置。
  28. 针对每列可分别设置字段对齐样式、内容对齐样式,包括左对齐、居中对齐、右对齐。
  29. 灵活性超高,可自由更改源码设置对齐方式、文字颜色、背景颜色等。
  30. 支持任意excel表格软件,包括但不限于excel2003-2021、wps、openoffice等。
  31. 纯Qt编写,支持任意Qt版本+任意编译器+任意系统。

三、体验地址

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_dataout.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun
  4. 个人主页:https://blog.csdn.net/feiyangqingyun
  5. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

四、效果图

五、相关代码

void DataOther::savePdf(const QString &fileName, const QString &content)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5,3,0))
//创建pdf文件对象
QFile pdfFile(fileName);
if (!pdfFile.open(QIODevice::WriteOnly)) {
return;
} //创建pdf写入对象
QPdfWriter pdfWriter(&pdfFile);
//设置纸张尺寸
pdfWriter.setPageSize(QPageSize(QPageSize::A4));
//设置纸张分辨率
pdfWriter.setResolution(100);
//设置页边距
int margin = 20;
pdfWriter.setPageMargins(QMarginsF(margin, margin, margin, margin), QPageLayout::Millimeter);
//设置纸张方向
pdfWriter.setPageOrientation(QPageLayout::Portrait); //设置标题和创建者
pdfWriter.setTitle("测试标题");
pdfWriter.setCreator("创建者Qt"); //创建pdf绘图对象
QPainter pdfPainter;
pdfPainter.begin(&pdfWriter); //设置字体
QFont font;
font.setPixelSize(20);
pdfPainter.setFont(font); //绘制第1页内容 - 纵向排版
pdfPainter.drawText(0, 0, "第一页内容"); //绘制第2页内容 - 横向排版
pdfWriter.setPageOrientation(QPageLayout::Landscape);
pdfWriter.newPage();
pdfPainter.drawText(0, 0, "第二页内容"); //绘制第3页内容 - 富文本
pdfWriter.setPageOrientation(QPageLayout::Portrait);
pdfWriter.newPage();
//pdfPainter.drawText(0, 0, "第三页内容"); //采用html格式内容输出非常强大
QStringList list;
#if 1
list << "<h1>这里是标题</h1>";
list << "<p>这里是段落。</p>";
int width = pdfWriter.width();
list << QString("<table width='%1' border='0.5' cellspacing='0' cellpadding='6'>").arg(width);
list << QString("<tr style='font-weight:bold;'><td align='center'>姓名</td><td align='center'>成绩</td></tr>");
for (int i = 0; i < 10; ++i) {
list << QString("<tr><td align='center'>姓名%1</td><td align='center'>%2</td></tr>").arg(i + 1).arg(rand() % 100);
}
list << "</table>";
#else
UavsReportData data;
DataCreat::creatUavsReportHead(list, data);
DataCreat::creatUavsReportBody(list, data);
#endif
QString html = list.join(""); QTextDocument pdfDoc;
pdfDoc.begin();
pdfDoc.setHtml(html);
pdfDoc.drawContents(&pdfPainter);
pdfDoc.end(); //绘制第4页内容 - 传入的富文本
if (!content.isEmpty()) {
pdfWriter.setPageOrientation(QPageLayout::Portrait);
pdfWriter.newPage();
pdfDoc.begin();
pdfDoc.setHtml(content);
pdfDoc.drawContents(&pdfPainter);
pdfDoc.end();
} //结束绘制并关闭文件
pdfPainter.end();
pdfFile.close();
#endif
}

Qt数据库应用18-横向纵向排版的更多相关文章

  1. QT 数据库编程三

    //mainwindow.cpp #include "mainwindow.h" #include "logindlg.h" #include "sc ...

  2. 打印datagridview内容 实现横向纵向分页(转)

    网上找了很多打印的,只发现这个比较好,实现了横向纵向分页. 代码如下: using System;using System.Collections.Generic;using System.Text; ...

  3. Oracle横向纵向汇总

    Oracle横向纵向汇总 有一张表test 如下, (NO 学生编号 ,cj 成绩) NO name KM CJ 001 张三 语文 80  001 张三 数学 86  001 张三 英语 75  0 ...

  4. qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)

    Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的几乎国内没有 ...

  5. 固定表头,单元格td宽度自适应,多内容出现-横向纵向滚动条数据表格的<前世今生>

    固定表头,单元格td宽度自适应,多内容出现-横向纵向滚动条数据表格的<前世今生>     先上图例   & 无论多少数据--都完美! 背景:由于我司行业方向,需要很多数据报表,则t ...

  6. Qt添加驱动——Qt数据库之添加MySQL驱动插件

    Qt数据库之添加MySQL驱动插件(1) 现在可用的数据库驱动只有3种,在Qt中,我们需要自己编译其他数据库驱动的代码,让它们以插件的形式来使用.下面我们就以现在比较流行的MySQL数据库为例,说明一 ...

  7. Qt数据库_资料

    1. QT笔记_数据库总结(一)-rojian-ChinaUnix博客.html http://blog.chinaunix.net/uid-28194872-id-3631462.html (里面有 ...

  8. Qt数据库 QSqlTableModel实例操作(转)

    本文介绍的是Qt数据库 QSqlTableModel实例操作,详细操作请先来看内容.与上篇内容衔接着,不顾本文也有关于上篇内容的链接. Qt数据库 QSqlTableModel实例操作是本文所介绍的内 ...

  9. C/C++ Qt 数据库与TreeView组件绑定

    在上一篇博文<C/C++ Qt 数据库QSql增删改查组件应用>介绍了Qt中如何使用SQL操作函数,并实现了对数据库的增删改查等基本功能,从本篇开始将实现数据库与View组件的绑定,通过数 ...

  10. C/C++ Qt 数据库与TableView多组件联动

    Qt 数据库组件与TableView组件实现联动,以下案例中实现了,当用户点击并选中TableView组件内的某一行时,我们通过该行中的name字段查询并将查询结果关联到ListView组件内,同时将 ...

随机推荐

  1. day10-变量、常量、作用域及命名规范

    变量 变量是什么?就是可以变化的量! Java是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括变量名.变量类型和作用域.   type varName [ ...

  2. 更改后端的数据格式适配el-tree组织树

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  3. 云原生周刊:CNCF 宣布 Cilium 毕业 | 2023.10.16

    开源项目推荐 Reloader Reloader 是一个 Kubernetes 控制器,用于监控 ConfigMap 和 Secrets 中的变化,并对 Pod 及其相关部署.StatefulSet. ...

  4. Elasticsearch倒排索引结构【转载】

    一切设计都是为了提高搜索的性能 倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引.通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key. 先来回 ...

  5. java基础语法(从0开始到java方法)

    文章目录 1.第一个java程序 2.数据的表示详解 2.1 整数在计算机中的存储原理 2.2 字符在计算机中的存储原理 2.3 图片视频声音的存储原理 2.4 数据的其他表示形式 2.5 不同进制在 ...

  6. Syncfusion宣布开源其为.NET MAUI开发的14个控件

    .NET MAUI是Xamarin.Forms的进化版,增加了对构建桌面应用的支持..NET MAUI的特点包括统一的框架.对桌面应用的支持.性能改进.使用现代技术以及开源特性.开源 .NET MAU ...

  7. AI Undetect是什么?

    标题:AI UNDETECT:超越AI检测的反检测神器 在数字时代,人工智能的飞速发展已经渗透到我们生活的各个领域,包括教育.科技.网络内容制作等.越来越多的人依赖AI来生成各种内容,从学术作业.论文 ...

  8. 基于Material Design风格开源、免费的WinForms UI控件库

    前言 今天大姚给大家分享一个基于 Google 的 Material Design 风格开源.免费的.NET WinForms UI控件库:MaterialSkin. WinForms介绍 WinFo ...

  9. BAT之shutdown命令

    今天想让电脑开机后固定时间后重启,但之前只用过关机的命令,就去查询资料,并将shutdown的命令用法整体记录一下. 1 ::取消关机 2 shutdown -a 3 4 ::关机 5 shutdow ...

  10. Rsync远程同步知识点总结

    Rsync: 简介:是一个开源的快速备份工具.可以在不同主机之间镜像同步整个目录,支持增量备份,保持链接(硬链接.软连接)和权限,且采用优化同步算法,传输前执行压缩(传输过程中效率加快了,但是会增加c ...