一、前言

数据能够打印到pdf文件,当然可以打印到纸张,而且使用qprinter默认就是打印到纸张的,上一篇文章写得功能是打印到pdf,其实还要单独特殊设置打印到文件,并指定格式为pdf。不指定输出文件和格式默认就是打印到纸张,关于Qt打印内容到纸张,网上的办法非常多,比如有些直接用painter绘制,逐步控制分页打印,个人还是喜欢html格式的内容传入,因为html格式相当灵活,可控范围相当大,而且整齐,甚至可以先直接输出到网页预览下效果,根据需求调整,后面的图文混排就是用的html+table实现的,如果不需要边框可以设置边框粗细为0,其实还是表格,但是看起来像文档一样。

数据打印基本步骤:

  1. 准备好要打印的数据。
  2. 实例化QPrinter对象。
  3. 设置输出格式setOutputFormat(QPrinter::NativeFormat)。
  4. 弹出打印预览对话框QPrintPreviewDialog。
  5. 关联信号槽在槽函数中绘制内容。
  6. 实例化文档对象QTextDocument。
  7. 将内容作为html设置到文档对象。
  8. 调用文档对象的print方法传入QPrinter对象打印。

结构体支持的参数:

  • 文件名称
  • 表名
  • 主标题
  • 副标题
  • 字段名称集合
  • 字段宽度集合
  • 内容集合
  • 行内容分隔符
  • 子内容分隔符
  • 边框宽度
  • 校验列
  • 校验类型
  • 校验值
  • 检验颜色
  • 最后列拉伸填充
  • 横向排版
  • 纸张边距

二、功能特点

  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. 支持任意excel表格软件,包括但不限于excel2003-2021、wps、openoffice等。
  26. 纯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 frmDataOut3::on_btnXls_clicked()
{
time.restart(); DataContent dataContent = getDataContent(AppConfig::CountXls);
dataContent.fileName = QUIHelper::appPath() + "/db/dataout3.xls";
dataContent.sheetName = "短信信息";
DataXls::saveXls(dataContent); setInfo(1, qMin(rowCount, AppConfig::CountXls));
QUIHelper::openFile(dataContent.fileName, "导出短信信息");
} void frmDataOut3::on_btnPdf_clicked()
{
time.restart(); DataContent dataContent = getDataContent(AppConfig::CountPdf);
dataContent.fileName = QUIHelper::appPath() + "/db/dataout3.pdf";
DataPrint::savePdf(dataContent); setInfo(1, qMin(rowCount, AppConfig::CountPdf));
QUIHelper::openFile(dataContent.fileName, "导出短信信息");
} void frmDataOut3::on_btnPrint_clicked()
{
DataContent dataContent = getDataContent(AppConfig::CountPrint);
DataPrint::print(dataContent);
} DataContent frmDataOut3::getDataContent(int maxCount)
{
DataContent dataContent;
dataContent.title = "所有短信记录";
dataContent.subTitle = QString("%1 导出短信记录").arg(DATETIME); QList<QString> columnNames;
columnNames << "序号" << "重量" << "温度" << "压力" << "类型" << "接收时间" << "短信内容";
QList<int> columnWidths;
columnWidths << 70 << 70 << 70 << 70 << 140 << 180 << 380;
dataContent.columnNames = columnNames;
dataContent.columnWidths = columnWidths; QStringList content, subTitle1, subTitle2;
getContent(maxCount, content, subTitle1, subTitle2);
dataContent.content = content;
dataContent.subTitle1 = subTitle1;
dataContent.subTitle2 = subTitle2; //边框粗细
dataContent.borderWidth = 1;
//导出到xls有样式比如边框需要开启 cellStyle = true
//dataContent.cellStyle = true;
dataContent.randomColor = ui->ckRandomColor->isChecked(); //下面表示第4列 (对应表中的 类型 字段) 值 包含 重量 关键字 则突出显示
dataContent.checkColumn = ui->ckCheckColumn->isChecked() ? 4 : -1;
dataContent.checkType = "contains";
dataContent.checkValue = "重量"; dataContent.stretchLast = ui->ckStretchLast->isChecked();
dataContent.landscape = true;
return dataContent;
}

Qt数据库应用4-数据打印到纸张的更多相关文章

  1. Qt+数据库

    前言支持内置数据库: 一.sqlite 1.在头文件中声明数据库对象 QSqlDatabase db; 2.在构造函数中定义对象(最好这样定义,因为对于db来说只需要addDatabase一次,否则多 ...

  2. 【转】Qt数据库总结

    转自:http://blog.chinaunix.net/uid-25201977-id-3014100.html #include <QtSql>QT += sql QSqlDataba ...

  3. Qt数据库(sqlite) — 总结

    #include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一: ...

  4. Qt数据库sqlite总结

      QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录QSqlRelationalTableModelQSqlQueryMo ...

  5. 2.大约QT数据库操作,简单的数据库连接操作,增删改查数据库,QSqlTableModel和QTableView,事务性操作,大约QItemDelegate 代理

     Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法參考博客:http://blog.csdn.net/tototuzuoquan ...

  6. 多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构

    前言 SaaS模式是什么? 传统的软件模式是在开发出软件产品后,需要去客户现场进行实施,通常部署在局域网,这样开发.部署及维护的成本都是比较高的. 现在随着云服务技术的蓬勃发展,就出现了SaaS模式. ...

  7. flask再学习-思考之怎么从数据库中查询数据在页面展示!

    看别人视频觉得很简单,要自己做蒙蔽了!这样子.NO! 1. 流程: 首先要有和数据库连接的驱动!一般有PYMySQL mysqlclient 等 使用扩展Flask-SQLAlchemy 获得orm对 ...

  8. 使用JDBC从数据库中查询数据的方法

    * ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回 ...

  9. 缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis

    springboot入门(三)-- springboot集成mybatis及mybatis generator工具使用 - FoolFox - CSDN博客 https://blog.csdn.net ...

  10. qt 数据库操作总结

    #include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一: ...

随机推荐

  1. js中判断数据类型的方法有哪些

    判断数据类型可以使用 typeof 但是typeof 判断数组和函数时返回的都是Object 不能具体判断,这时使用 instanceof 可以判断对象是否是另一个函数创造的 : 用法: typeof ...

  2. KubeSphere 社区双周报 | KubeSphere 3.4.0 已发布 | 2023.7.7-7.20

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  3. 云原生爱好者周刊:寻找 Netlify 开源替代品

    开源项目推荐 Coolify Coolify 是一个开源自托管的 Heroku/Netlify 替代品,颜值还不错. Podman Desktop Podman Desktop 是针对 Podman ...

  4. Plain-Det:同时支持多数据集训练的新目标检测 | ECCV'24

    近期在大规模基础模型上的进展引发了对训练高效大型视觉模型的广泛关注.一个普遍的共识是必须聚合大量高质量的带注释数据.然而,鉴于计算机视觉中密集任务(如目标检测和分割)标注的固有挑战,实际的策略是结合并 ...

  5. Buffer和Channel

    IO 和 NIO 区别: 可简单认为:IO 是面向流的处理,NIO 是面向块(缓冲区)的处理 面向流的 I/O 系统一次一个字节地处理数据. 一个面向块(缓冲区)的 I/O 系统以块的形式处理数据. ...

  6. 【小记】Docker容器间SSH公钥自动交换实现免密登录的一次尝试

    咋想到这茬了 最近开始忙毕设的事儿了,想部署个伪分布式的Spark + Hadoop集群来进行测试.思来考去,最终咱把目光放在了Docker上. 盘了两天,发现这玩意意外的有趣,镜像构建好后开箱即用, ...

  7. LeetCode题目练习记录 _数组和链表01 _20211007

    LeetCode题目练习记录 _数组和链表01 _20211007 26. 删除有序数组中的重复项 难度简单2247 给你一个有序数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次 ...

  8. 别再忽视!PostgreSQL Public 模式的风险以及安全迁移

    别再忽视!PostgreSQL  Public 模式的风险以及安全迁移 作者:桦仔 10余年DBA工作经验 微信:debolop QQ交流群:740052625 公众号:数据库实战派 问题起因 前几天 ...

  9. 论文发表汇款:SWIFT code跨境汇款 —— 如何向境外账号汇款

    如何向境外账号汇款? 有以下几种方式: 对方开通中国金融产品账号或在中国有代理公司:如对方开通中国的银行卡,微信.支付宝,等等,这样其实就不属于跨境汇款了,外国的一些公司已经开设中国的金融产品和银行账 ...

  10. 一文彻底弄懂Spring Boot的启动过程

    一,Spring Boot启动过程 1. 启动入口 Spring Boot 应用的启动入口通常是一个包含 @SpringBootApplication 注解的主类,并调用 SpringApplicat ...