Qt数据库应用之实现数据图文混排

目录
  • 一、前言
  • 二、功能特点
  • 三、体验地址
  • 四、效果图
  • 五、相关代码

一、前言

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

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

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

二、功能特点

组件同时集成了导出数据到csv、xls、pdf和打印数据。

所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便。

同时支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等数据源。

提供静态方法直接传入QTableView、QTableWidget控件,自动识别列名、列宽和数据内容。

每组功能都提供单独的完整的示例,注释详细,非常适合各阶段Qter程序员。

原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,支持嵌入式linux。

速度超快,9个字段10万行数据只需要2秒钟完成。

只需要四个步骤即可开始急速导出海量数据比如100W条记录到Excel。

同时提供直接写入数据接口和多线程写入数据接口,不卡主界面。

可设置标题、副标题、表名。

可设置导出数据的字段名、列名、列宽。

可设置末尾列自动拉伸填充,默认拉伸更美观。

可设置是否启用校验过滤数据,启用后符合规则的数据特殊颜色显示。

可指定校验的列、校验规则、校验值、校验值数据类型。

校验规则支持 精确等于==、大于>、大于等于>=、小于<、小于等于<=、不等于!=、包含contains。

校验值数据类型支持 整型int、浮点型float、双精度型double,默认文本字符串类型。

可设置随机背景颜色及需要随机背景色的列集合。

支持分组输出数据,比如按照设备分组输出数据,方便查看。

可设置csv分隔符、行内容分隔符、子内容分隔符。

可设置边框宽度、自动填数据类型,默认自动数据类型开启。

可设置是否开启数据单元格样式,默认不开启,不开启可以节约大概30%的文件体积。

可设置横向排版、纸张边距等,比如导出到pdf以及打印数据。

支持图文混排导出数据到pdf以及打印数据,自动分页。

灵活性超高,可自由更改源码设置对齐方式、文字颜色、背景颜色等。

支持任意excel表格软件,包括但不限于excel2003-2021、wps、openoffice等。

纯Qt编写,支持任意Qt版本+任意编译器+任意系统。

三、体验地址

体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_dataout.zip

国内站点:https://gitee.com/feiyangqingyun

国际站点:https://github.com/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数据库应用之实现数据图文混排的详细内容,更多关于Qt数据图文混排的资料请关注我们其它相关文章!

(0)

相关推荐

  • C/C++ Qt 数据库与Chart历史数据展示

    在前面的博文中具体介绍了QChart组件是如何绘制各种通用的二维图形的,本章内容将继续延申一个新的知识点,通过数据库存储某一段时间节点数据的走向,当用户通过编辑框提交查询记录时,程序自动过滤出该时间节点下所有的数据,并将该数据动态绘制到图形组件内,实现动态查询图形的功能. 首先通过如下代码,创建Times表,表内记录有某个主机某个时间节点下的数值: #include <QCoreApplication> #include <QSqlDatabase> #include <QS

  • C/C++ Qt数据库SqlRelationalTable关联表详解

    在上一篇博文中详细介绍了SqlTableModle组件是如何使用的,本篇博文将介绍SqlRelationalTable关联表组件,该组件其实是SqlTableModle组件的扩展类,SqlRelationalTable组件可以关联某个主表中的外键,例如将主表中的某个字段与附加表中的特定字段相关联起来,QSqlRelation(关联表名,关联ID,名称)就是用来实现多表之间快速关联的. 首先我们创建两张表,一张Student表存储学生名字以及学生课程号,另一张Departments存储每个编号所对

  • Qt数据库应用之实现数据打印到纸张

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 数据能够打印到pdf文件,当然可以打印到纸张,而且使用qprinter默认就是打印到纸张的,上一篇文章写得功能是打印到pdf,其实还要单独特殊设置打印到文件,并指定格式为pdf.不指定输出文件和格式默认就是打印到纸张,关于Qt打印内容到纸张,网上的办法非常多,比如有些直接用painter绘制,逐步控制分页打印,个人还是喜欢html格式的内容传入,因为html格式相当灵活,可控范围相当大,而且整齐,甚至可以先直接输出到

  • Qt数据库应用之实现数据的导入与导出

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 在经历过大大小小十几个甚至几十个纯QtWidget项目后,涉及到数据库相关的项目,几乎都有一个需求,将少量的信息数据比如设备信息.防区信息等,导出到文件保存好,然后用户可以打开该表格进行编辑,编辑完成后保存,再重新导入到软件中,这样相当于安排专人录入数据,而不是在软件中一个个新增效率低了些,甚至有些软件运行在嵌入式板子上或者一些特殊场景,不大方便现场添加编辑信息,如果是提供模板之类的让用户添加好,然后再一次性导入,这

  • Qt实现数据导出到xls的示例代码

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 导入导出数据到csv由于语法简单,适用场景有限,于是乎还是必须再造一个轮子导出数据到xls,在经历过数十年的项目实战经验中不断调整和优化.尤其记得当初第一个版本v0.01大概在2011年左右完成的,当时是公司项目运行在嵌入式板子上,需要导出警情记录,拷贝到电脑上打印,由于嵌入式根本没有也不可能去安装excel等软件,硬着头皮去研究了xml格式的xls文件,按照那个规则组合成简单的导出数据,这个思路想法理论上比QtXl

  • Qt数据库应用之数据打印到pdf

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 自从数据可以导出到xls,又有客户提出了不同的需求,比如既然可以将数据导出到xls,那是否可以导出到pdf文件呢?因为xls打开以后用户可以修改数据造假之类的,而pdf默认是不可编辑的,除非借助专业的工具,所以如果想要限定用户导出数据不能被更改,那导出pdf是最佳选择.写程序往往都是这样,一步步慢慢增加,随着用户需求的增加,程序量也越来越多,轮子组件也越来越多.往往客户提需求的时候,一定要认真聆听,尤其是一线用户,实

  • Qt数据库应用之实现数据图文混排

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 除了能够打印基本的文字信息数据到pdf和纸张,越来越多的应用需求还要求能够导出图片,并且要支持图文混排,相当于doc文档类似,当然也不会是太复杂的,类似于打印报表一样,有表格形式的文字描述,也有对应的图片插入其中,图文混排的应用场景还真不少比如医疗行业输出诊断结果往往都带了图片.于是针对这个需求特意开辟了新的类DataCreat专门生成报表的数据,将生成好的数据体直接传入给DataPrint类即可,如果有各种各样的不

  • Qt数据库应用之实现数据分组导出

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 数据分组导出和打印这个需求并不是近期的需求,而是之前做温湿度监控系统的时候提的需求,当然也有几个系统用到了,比如啤酒保鲜监控系统.这个需求的应用场景是,有很多个设备,每个设备都产生了很多的运行日志.报警日志等,这些日志按照时间顺序存储在数据库中,用户需要按照不同设备分组导出,同时对应统计有多少行记录,开始时间和结束时间,以副标题的形式展示在文档中. 数据源有了,关键是如何组织这些数据,传入参数的时候以特定分隔符做标记

  • Android中使用TextView实现图文混排的方法

    向TextView或EditText中添加图像比直接添加文本复杂一点点,需要用到<img>标签. <img>只有一个src属性,该属性原则上应该指向一个图像地址或可以找到某个图像资源的唯一标识.但要注意的是,系统并不会直接根据src属性所指的值自动获取和显示图像,这一切都需要我们去做.说白了,src属性指的是什么只有开发者自己知道.开发者需要告诉系统src属性到底指的是什么,然后系统才会知道怎么做. 解析src属性值需要ImageGetter对象的getDrawable方法来完成.

  • IOS 图文混排(CoreText.framework)详解及实例

    IOS 图文混排(CoreText.framework)        本文主要介绍了IOS图文混排的资料,这里整理了在网上查找的内容,帮助理解,掌握这部分知识,以下就是整理的内容: 利用CORETEXT进行图文混排. 实现代码: void RunDelegateDeallocCallback( void* refCon ){ } CGFloat RunDelegateGetAscentCallback( void *refCon ){ NSString *imageName = (NSStri

  • Android下Button实现图文混排效果

    Button实现图文混排效果,具体内容如下 一.简介 本文介绍两种图文混排方式 1.android:drawableTop="@drawable/star"实现文字上有图片 当然有上下左右等等 2.SpannableString的ImageSpan实现图文混排 二.代码实例 效果图: 一二三四是用的第一种方式 下面的用的第二种方式 代码: fry.Activity02 package fry; import com.example.buttonDemo1.R; import andro

  • iOS利用NSAttributedString实现图文混排效果示例

    前言 NSAttributedString 可以非常方便的实现文字排版和图文混排功能,UILabel 和 UITextView 都能添加 NSAttributedString 属性字符串,通过这一点,可以实现带有属性的文字和文字内包含图片的文本内容展示.话不多说了,下面来一起看看详细的介绍吧. 效果如下: 示例代码如下: 1-初始化可变属性字符串 NSMutableAttributedString *attributedString = [[NSMutableAttributedString a

  • 详解Android SpannableString多行图文混排的应用实战

    TeXtView大家应该都不陌生,文本展示控件嘛! 就用TextView显示普普通通的文本,OK,很简单,Android入门的都会,没入门的在门缝外看两眼也都会,哈哈,开玩笑.那要是设计在开发需求中要求类似微信聊天表情一样在TextView中插入表情图片呢? 有的小伙伴就会说啦,"TextView添加图片我会啊,不就是drawableLeft,drawableRight嘛!" 嗯 ~ 也行,算是一种方法,可这有一个限制,首先,图片只能在TextView的两端,其次,两端都只能设置一张图

  • CSS图文混排的几种方案

    百度新闻首页的方案: 复制代码 代码如下: <table> <tbody> <tr> <td class="topic-pic"><a href=""><img src=""></a></td> <td class="topic-txt">-</td> </tr> </tbody>&l

随机推荐