一、前言

除了能够打印基本的文字信息数据到pdf和纸张,越来越多的应用需求还要求能够导出图片,并且要支持图文混排,相当于doc文档类似,当然也不会是太复杂的,类似于打印报表一样,有表格形式的文字描述,也有对应的图片插入其中,图文混排的应用场景还真不少比如医疗行业输出诊断结果往往都带了图片。于是针对这个需求特意开辟了新的类DataCreat专门生成报表的数据,将生成好的数据体直接传入给DataPrint类即可,如果有各种各样的不同的图文混排格式,可以直接在DataCreat类中生成好就行,默认提供了一种图文混排报表的模板,其他格式都按照这个格式来就行,建议做成结构体的形式,比如提供的模板是无人机监控系统告警报告。

无人机监控系统告警报告结构体参数:

  • 大标题
  • 副标题
  • 设备名称
  • 坐标经度值
  • 坐标纬度值
  • 报警触发时间
  • 报告打印时间
  • 警情类型
  • 报警设备数量
  • 报警级别
  • 报警图片集合
  • 最后列拉伸填充
  • 横向排版
  • 纸张边距

二、功能特点

  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/

四、效果图

五、相关代码

#include "datacreat.h"

void DataCreat::creatUavsReportHead(QStringList &list, const UavsReportData &reportData)
{
//表格开始
list << "<table border='0.0' cellspacing='0' cellpadding='6'>"; //标题
list << "<tr>";
list << QString("<td width='100%' align='center' style='font-size:22px;font-weight:bold;' colspan='%1'>%2</td>").arg(2).arg(reportData.title);
list << "</tr>"; //横线或者换行
list << "<hr>";
//list << "<br>"; //当前模块通用样式
QString style = "style='font-size:18px;'"; //设备名称
QString name = QString("设备名称: %1").arg(reportData.name);
list << "<tr>";
list << QString("<td colspan='%1' %2>%3</td>").arg(2).arg(style).arg(name);
list << "</tr>"; //经度纬度
QString lng = QString("设备经度: %1").arg(reportData.lng);
QString lat = QString("设备纬度: %1").arg(reportData.lat);
list << "<tr>";
list << QString("<td %1>%2</td>").arg(style).arg(lng);
list << QString("<td %1>%2</td>").arg(style).arg(lat);
list << "</tr>"; //告警日期+报告时间
QString timeAlarm = QString("告警日期: %1").arg(reportData.timeAlarm);
QString timeReport = QString("报告时间: %1").arg(reportData.timeReport);
list << "<tr>";
list << QString("<td %1>%2</td>").arg(style).arg(timeAlarm);
list << QString("<td %1>%2</td>").arg(style).arg(timeReport);
list << "</tr>"; //表格结束
list << "</table>";
} void DataCreat::creatUavsReportBody(QStringList &list, const UavsReportData &reportData, int imageWidth)
{
//换行
list << "<br><br>"; //表格开始
list << "<table border='0.5' cellspacing='0' cellpadding='5'>"; //标题
list << "<tr>";
list << QString("<td width='100%' align='center' style='font-size:20px;font-weight:bold;' colspan='%1'>%2</td>").arg(2).arg(reportData.subTitle);
list << "</tr>"; //当前模块通用样式
QString style = "style='font-size:18px;'"; //告警类型
QString type = QString("告警类型: %1").arg(reportData.type);
list << "<tr>";
list << QString("<td width='100%' colspan='%1' %2>%3</td>").arg(2).arg(style).arg(type);
list << "</tr>"; //目标数量+威胁等级
QString textCount = QString("目标数量: %1").arg(reportData.textCount);
QString textLevel = QString("威胁等级: %1").arg(reportData.textLevel);
list << "<tr>";
list << QString("<td %1>%2</td>").arg(style).arg(textCount);
list << QString("<td %1>%2</td>").arg(style).arg(textLevel);
list << "</tr>"; //图像队列
QStringList listImage = reportData.images;
int count = listImage.count(); //告警图像
QString text = QString("告警图像 ( 共 %1 张 )").arg(count);
list << "<tr>";
list << QString("<td width='100%' align='center' style='font-size:20px;font-weight:bold;' colspan='%1'>%2</td>").arg(2).arg(text);
list << "</tr>"; //计算绘制区域大小,先将图像缩放到合适大小并保存在本地
QString path = qApp->applicationDirPath() + "/snap/";
for (int i = 0; i < count; ++i) {
QImage image(listImage.at(i));
if (image.width() > imageWidth) {
QString name = path + QString("%1.jpg").arg(i + 1);
image = image.scaled(imageWidth, image.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
image.save(name, "jpg");
listImage[i] = name;
}
} //qDebug() << listImage;
//垂直居中
style = "style='vertical-align:middle;'";
for (int i = 0; i < count; i = i + 2) {
list << "<tr>";
list << QString("<td align='center' %1><img src='%2'></td>").arg(style).arg(listImage.at(i));
//需要过滤判断下,很可能是奇数会超过下一个
if (i < count - 1) {
list << QString("<td align='center' %1><img src='%2'></td>").arg(style).arg(listImage.at(i + 1));
}
list << "</tr>";
} //表格结束
list << "</table>";
}

Qt数据库应用6-数据图文混排的更多相关文章

  1. Android--多线程之图文混排

    前言 本周一直在说Android多线程的那些事儿,本篇博客聊一聊Android开发中一个比较经典的案例,网络数据图文混排,本片博客的案例只涉及关于开启多线程访问网络数据,不涉及缓存的内容.众所周知,从 ...

  2. EditText图文混排

    下面就具体说一下我遇到的问题,首先是EditText里面的图文混排问题,这个问题的难点就是三点: 1.怎么插图片 2.怎么保存插入的图片和文字 3.怎么解析回图片和文字 解决: 一.怎么插入图片 在这 ...

  3. 用NSAttributedString实现简单的图文混排

    iOS7以后,因为TextKit的强大,可以用NSAttributedString很方便的实现图文混排(主要是利用了NSTextAttachment). 关于Textkit的牛逼之处,可以参考objc ...

  4. ios图文混排

    图文混排的形式 1. 富文本形式 2. core Text(文字排版) 3. TextKit 4. UIWebView 一.富文本 我们可以采用attributeString来进行图文混排.例如一个文 ...

  5. ListView异步加载图片,完美实现图文混排

    昨天参加一个面试,面试官让当场写一个类似于新闻列表的页面,文本数据和图片都从网络上获取,想起我还没写过ListView异步加载图片并实现图文混排效果的文章,so,今天就来写一下,介绍一下经验. Lis ...

  6. Android 自绘TextView解决提前换行问题,支持图文混排

    先看下效果图: 上面是MTextView,下面是默认的TextView. 一.原因 用最简单的全英文句子为例,如果有一个很长的单词,这一行剩余的空间显示不下了,那么规则就是不打断单词,而是把整个单词丢 ...

  7. CoreText 实现图文混排

    CoreText 实现图文混排 相关博文推荐 IOS CoreText.framework - 基本用法 IOS CoreText.framework - 段落样子CTParagraphStyle h ...

  8. 自定义图文混排视图MyImageTextView

    http://blog.csdn.net/xujunfeng000/article/details/36399339?utm_source=tuicool&utm_medium=referra ...

  9. AS3聊天单行输入框图文混排完美实现

    几年前刚毕业.第一个游戏模块做的就是聊天.到如今.几个游戏写过几次聊天模块. 之前在4399做的<幻龙骑士>(又名<神骑士>),还有上周六刚上线的<疯狂的子弹>, ...

  10. Unity UGUI图文混排(七) -- 下划线

    之前更新超链接的时候,忘了搭配实现一个下划线的功能,这篇文章就是来补上这一个功能,时间有点长,一方面没有很好的思路,一方面也没多少时间. 先在网上收集了一下下划线的实现操作,一种是在文本下再创建一个文 ...

随机推荐

  1. Vue 项目优化解决方案 有哪些 ?

    1. 打包的时候 , 通过插件把css代码单独抽离出来使用 link 引入 2. 打包的时候 , 通过webpack内置插件optimization  把 公共的js代码抽离出来 ps:打包之后,代码 ...

  2. 浅析Jvm

    浅析Jvm 基本概念 引言 Java 虚拟机(JVM,Java Virtual Machine)是 Java 生态系统的核心组成部分,它为 Java 应用程序提供了一个运行环境.JVM 的主要职责是将 ...

  3. java的split方法的转义字符

    一.实例 我们都知道  String s="ad,dfjdlfs,df,s,dfl"; 执行 String re[]=s.split(",");     则re ...

  4. spring基础配置原则

    spring框架本身有四大原则:1.使用pojo进行轻量级和最小侵入式开发2.通过依赖注入和基于接口编程实现松耦合3.通过AOP和默认习惯进行声明式编程4.使用AOP和模板减少模式化代码spring ...

  5. 组装一台100TB全闪存100G光纤网络海景房幻彩RGB文件服务器【翼王】

    视频地址: https://www.youtube.com/watch?v=lzPSIzbYrlU

  6. 3.20 什么是环境变量,Linux环境变量有哪些?

    变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值.在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME).邮件存放 ...

  7. 记录一个opencv的imread方法无法读取成功的问题,【设计到visual studio和静态库(lib)匹配的问题】

    一.为什么会遇到这个问题 公司需要对多图进行拼接,经过多番查找发现了OpenStitching这个库.可以实现多图拼接.在python段尝试了之后感觉效果不错,所以使用Visual Studio进行C ...

  8. MongoDB学习笔记之 第1章 MongoDB的安装

    MongoDB学习笔记之 第1章 MongoDB的安装 MongoDB学习笔记之 第2章 MongoDB的增删改查 MongoDB学习笔记之 第3章 MongoDB的Java驱动 MongoDB学习笔 ...

  9. 编程辅助工具之Kite

    python作为一门门槛很低但又功能强大的编程语言,现在已经得到了非常广泛的使用,但是它的常用库非常多,而且往往更新后许多方法都有所变化,因此想要记住其大部分函数的用法对于大部分人来说比较困难,因而会 ...

  10. 工具篇-FinalShell

    转载:https://www.toutiao.com/i6694563184428188171?wid=1625538368131 FinalShell是一款免费的国产的集SSH工具.服务器管理.远程 ...