一、前言

除了能够打印基本的文字信息数据到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. 0503-autograd实战之线性回归

    0503-autograd实战之线性回归 目录 一.用 variable 实现线性回归(autograd 实战) 二.第五章总结 pytorch完整教程目录:https://www.cnblogs.c ...

  2. 神经网络之卷积篇:详解经典网络(Classic networks)

    详解经典网络 首先看看LeNet-5的网络结构,假设有一张32×32×1的图片,LeNet-5可以识别图中的手写数字,比如像这样手写数字7.LeNet-5是针对灰度图片训练的,所以图片的大小只有32× ...

  3. SQL语法-列的新增、删除

    MySQL的语法: 新增列 ALTER TABLE `xxdb`.`xxtable` ADD COLUMN `xx_flag` varchar(1) NULL; 删除列 ALTER TABLE `xx ...

  4. [2024领航杯] Pwn方向题解 babyheap

    [2024领航杯] Pwn方向题解 babyheap 前言: 当然这个比赛我没有参加,是江苏省的一个比赛,附件是XiDP师傅在比赛结束之后发给我的,最近事情有点多,当时搁置了一天,昨天下午想起来这个事 ...

  5. 华为OpenEnler Linux系统部署LNMP

    LNMP是Linux+Nginx+Mysql+PHP所构建的一个动态开发环镜 我这里使用的系统是华为的OpenEnler系统,使用了Nginx1.12版本.Mysql8和PHP7.4 如果有出错的地方 ...

  6. RocketMQ Streams拓扑构建与数据处理过程

    本文作者:倪泽,Apache RocketMQ committer.RSQLDB/RocketMQ Streams Maintainer 01 背景 RocketMQ Streams 1.1.0版本已 ...

  7. mysql替换内容

    UPDATE storage SET guige = REPLACE(guige, '×', 'x')

  8. 🥳重磅更新!Fluent Editor 开源富文本支持 LaTeX 可编辑公式啦~

    你好,我是 Kagol,个人公众号:前端开源星球. Fluent Editor 是一个基于 Quill 2.0 的富文本编辑器,在 Quill 基础上扩展了丰富的模块和格式,框架无关.功能强大.开箱即 ...

  9. element 动态合并表格---进阶版

    错误展示 正确展示 如果使用上次博客写的element 动态合并表格那么会出现上述图片情况,所以对其进行完善实现下图(正确展示)情况 处理函数 mergeTableRow(data, merge) { ...

  10. string,字符串使用指南

    string 创建 创建一个字符串或者字符串数组如下 用 cin 输入,可以读一整串字符直到空格或换行才结束 #include <iostream> using namespace std ...