一、前言

横向柱状图的绘制这玩意当初还着实花费了一些时间,因为从v1版本开始,默认XY坐标轴是没有交换位置的处理的,也只有垂直的柱状图,要想换成横向的柱状图必须是自己拿到数据重新绘制,数据值的设置一般有这几个参数,值的区域、显示数据值的位置(0-不绘制 1-顶部上面 2-顶部居中 3-中间居中 4-底部居中)、数据值的精确度(有时候可能是浮点数需要有小数位)、柱子的颜色(没有校验的时候按照设置的颜色)、是否校验数据(开启校验后按照校验的规则取对应的颜色)。

在进行二次开发的时候,最初的版本是所有功能写在一个类中,这样方便用户直接引入一个文件就能使用,后面随着功能的增多,发现一个代码文件中放了多个类管理起来不方便,后面还是拆分成不同的文件,比如自定义柱状图类CustomPlotBarv、自定义平滑线类CustomPlotLine、自定义图层类CustomPlotTracer,这样学习起来方便,关注点是拓展性和管理学习方便,而不是文件数量少,QCustomPlot其实开发阶段也是很多个类文件的,只不过发布的时候用工具合并成了一个文件,这样体积小。

二、功能特点

  1. 采用分层设计,整体总共分三级界面,一级界面是整体布局,二级界面是单个功能模块,三级界面是单个控件。
  2. 子控件包括饼图、圆环图、曲线图、柱状图、柱状分组图、横向柱状图、横向柱状分组图、合格率控件、百分比控件、进度控件、设备状态面板、表格数据、地图控件、视频控件等。
  3. 二级界面可以自由拖动悬浮,支持最小化隐藏、最大化关闭、响应双击自定义标题栏。
  4. 数据源支持模拟数据(默认)、数据库采集、串口通信(需定制)、网络通信(需定制)、网络请求等,可自由设定每个子界面的采集间隔即数据刷新频率。
  5. 采用纯QWidget编写,亲测Qt4.6到Qt6.2任意版本,理论上支持后续其他Qt版本。
  6. 超强跨平台,亲测windows、linux、mac、国产uos、国产银河麒麟kylin等系统,效果完美,同时还支持嵌入式linux比如树莓派、香橙派、全志、imx6等。
  7. 同时集成了自定义控件、qchart饼图、echart地图等功能。
  8. 内置多套配色风格样式(紫色、蓝色、深蓝、黑色),默认紫色,自适应任意分辨率。
  9. 可设置系统标题、目标分辨率、布局方案,启动立即应用。
  10. 可设置主背景颜色、面板颜色、十字线游标颜色等各种颜色。
  11. 可设置多条曲线不同颜色,没有设置颜色的情况下内置多套精美颜色随机应用。
  12. 可设置标题栏背景颜色、文字颜色。
  13. 可设置曲线图表背景颜色、文字颜色、网格颜色。
  14. 可设置正常颜色、警戒颜色、报警颜色、禁用颜色、百分比进度颜色。
  15. 可分别设置各种字体大小,比如全局字体、软件名称、标题栏、子标题栏、加粗标签等。
  16. 可设置标题栏高度、表头高度、行高度。
  17. 曲线支持游标、定位线、悬停高亮数据点、悬停显示值。
  18. 柱状图支持顶部(可设置顶端、上部、中间、底部)显示数据,全部自适应计算位置。
  19. 支持平滑曲线,内置多种平滑曲线算法,还支持面积图平滑。
  20. 面积图填充颜色可选多种规则比如单色透明度填充、透明度渐变填充等。
  21. 数据库支持sqlite、mysql、postgresql、oracle、国产人大金仓等数据库。
  22. 主界面直接鼠标右键切换布局、配色方案、关闭开启某个二级窗体。
  23. 自动记忆所有子窗口的大小和位置,下次启动立即应用。
  24. 动态加载布局方案菜单,可以动态新建布局、恢复布局、保存布局、另存布局等,用户可以制造任意布局。
  25. 二级窗体,双击从主窗体分离出来浮动,可以自由调整大小。再次双击标题栏最大化,再次双击还原。
  26. 子模块也可以全屏显示作为一个大屏,这样就可以一个大屏拓展出多个子大屏,放大查看子模块的数据详情,适用多屏展示。
  27. 每个模块都可以自定义采集速度,如果是数据库采集会自动排队处理,后期还可以拓展每个子模块都独立的数据库采集。
  28. 提供系统设置模块进行整体的配置参数设置,效果立即应用。
  29. 提供精美炫酷的大屏地图模块,包括静态图片、闪烁效果、迁徙效果、世界地图、区域地图等,可指定点的经纬度坐标,识别单击响应,可以做地图跳转等,每个点都可以不同的颜色和提示信息。
  30. 除了提供大屏系统外,还将每个模块都做了独立的模块示例界面,每个模块都可以独立学习使用,里面用到的控件也单独做了控件示例界面,方便学习每个控件如何使用。
  31. 非常详细的开发和使用手册,其中包括数据库说明、模块对照图、控件对照图、项目结构、代码说明(精确到每个类)、演示demo、使用方法等。

三、体验地址

  1. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_bigscreen.zip。
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun
  4. 个人主页:https://blog.csdn.net/feiyangqingyun
  5. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  6. 在线文档:https://feiyangqingyun.gitee.io/qwidgetdemo/bigscreen/

四、效果图

五、核心代码

#include "customplotbarh.h"

CustomPlotBarh::CustomPlotBarh(QCustomPlot *parentPlot) : QCPItemRect(parentPlot)
{
value = 0;
valuePosition = 1;
valuePrecision = 0;
valueColor = Qt::white;
checkData = false;
} void CustomPlotBarh::draw(QCPPainter *painter)
{
//获取整个画布区域
#ifdef qcustomplot_v1
QRectF rect = QRectF(topLeft->pixelPoint(), bottomRight->pixelPoint());
#else
QRectF rect = QRectF(topLeft->pixelPosition(), bottomRight->pixelPosition());
#endif painter->setPen(this->pen().color());
painter->setBrush(this->brush());
painter->drawRect(rect); //设置文本的颜色,还可以设置字体
painter->setPen(valueColor); //这里可以设置小数点精确度
QString strValue = QString::number(value, 'f', valuePrecision);
//计算值的宽度
QFontMetrics fm = painter->fontMetrics();
#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0))
int textWidth = fm.horizontalAdvance(strValue);
#else
int textWidth = fm.width(strValue);
#endif //0-不绘制 1-顶部上面 2-顶部居中 3-中间居中 4-底部居中
//设置区域一点点偏差,看起来不那么拥挤
int offset = 5;
if (valuePosition == 1) {
rect.setWidth(rect.width() + textWidth + offset);
painter->drawText(rect, Qt::AlignRight | Qt::AlignVCenter, strValue);
} else if (valuePosition == 2) {
rect.setWidth(rect.width() - offset);
painter->drawText(rect, Qt::AlignRight | Qt::AlignVCenter, strValue);
} else if (valuePosition == 3) {
painter->drawText(rect, Qt::AlignHCenter | Qt::AlignVCenter, strValue);
} else if (valuePosition == 4) {
rect.setX(rect.x() + offset);
painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, strValue);
}
} double CustomPlotBarh::getValue() const
{
return this->value;
} int CustomPlotBarh::getValuePosition() const
{
return this->valuePosition;
} int CustomPlotBarh::getValuePrecision() const
{
return this->valuePrecision;
} QColor CustomPlotBarh::getValueColor() const
{
return this->valueColor;
} bool CustomPlotBarh::getCheckData() const
{
return this->checkData;
} void CustomPlotBarh::setValue(double value)
{
if (this->value != value) {
this->value = value;
}
} void CustomPlotBarh::setValuePostion(int valuePosition)
{
if (this->valuePosition != valuePosition) {
this->valuePosition = valuePosition;
}
} void CustomPlotBarh::setValuePrecision(int valuePrecision)
{
if (this->valuePrecision != valuePrecision) {
this->valuePrecision = valuePrecision;
}
} void CustomPlotBarh::setValueColor(const QColor &valueColor)
{
if (this->valueColor != valueColor) {
this->valueColor = valueColor;
}
} void CustomPlotBarh::setCheckData(bool checkData)
{
if (this->checkData != checkData) {
this->checkData = checkData;
}
} void CustomPlotBarh::setRect(const QPointF &p1, const QPointF &p2)
{
this->topLeft->setCoords(p1.x(), p1.y());
this->bottomRight->setCoords(p2.x(), p2.y());
}

Qt编写可视化大屏电子看板系统19-横向柱状图的更多相关文章

  1. Qt编写数据可视化大屏界面电子看板13-基础版

    一.前言 之前发布的Qt编写的可视化大屏电子看板系统,很多开发者比较感兴趣,也收到了很多反馈意见,纵观市面上的大屏系统,基本上都是B/S结构的web版本,需要在后台进行自定义配置模块,绑定数据源等,其 ...

  2. Qt编写项目作品大全(自定义控件+输入法+大屏电子看板+视频监控+楼宇对讲+气体安全等)

    一.自定义控件大全 (一).控件介绍 超过160个精美控件,涵盖了各种仪表盘.进度条.进度球.指南针.曲线图.标尺.温度计.导航条.导航栏,flatui.高亮按钮.滑动选择器.农历等.远超qwt集成的 ...

  3. Qt编写数据可视化大屏界面电子看板2-配色方案

    一.前言 做完整个数据可视化大屏界面电子看板系统后,为了提升点逼格,需要提供好几套默认的风格样式以供选择,这样用户可以选择自己喜欢的配色方案来作为整个系统的颜色方案,去看了下市面上大部分的大屏电子看板 ...

  4. Qt编写安防视频监控系统9-自动隐藏光标

    一.前言 这个效果的灵感来自于大屏电子看板系统,在很多系统中尤其是上了大屏的时候,其实在用户不在操作的时候,是很不希望看到那个鼠标箭头指针的,只有当用户操作的时候才显示出来,这个就需要开个定时器定时计 ...

  5. Qt编写数据可视化大屏界面电子看板系统

    一.前言 目前大屏大数据可视化UI这块非常火,趁热也用Qt来实现一个,Qt这个一站式超大型GUI超市,没有什么他做不了的,大屏电子看板当然也不在话下,有了QSS和QPainter这两个无敌的工具组合, ...

  6. Qt编写数据可视化大屏界面电子看板12-数据库采集

    一.前言 数据采集是整个数据可视化大屏界面电子看板系统核心功能,没有数据源,这仅仅是个玩具UI,没啥用,当然默认做了定时器模拟数据,产生随机数据,这个可以直接配置文件修改来选择采用何种数据采集方法,总 ...

  7. Qt编写数据可视化大屏界面电子看板11-自定义控件

    一.前言 说到自定义控件,我是感觉特别熟悉的几个字,本人亲自原创的自定义控件超过110个,都是来自各个行业的具体应用真实需求,而不是凭空捏造的,当然有几个小控件也有点凑数的嫌疑,在编写整个数据可视化大 ...

  8. Qt编写数据可视化大屏界面电子看板8-调整间距

    一.前言 在数据可视化大屏界面电子看板系统中,前期为了使用目标客户机,调整间距是必不可少的工作,QMainWindow中的QDockWidget,会默认生成布局和QSplitter调整宽高大小,鼠标移 ...

  9. Qt编写数据可视化大屏界面电子看板4-布局另存

    一.前言 布局另存是数据可视化大屏界面电子看板系统中的额外功能之一,主要用于有时候用户需要在现有布局上做个微调,然后直接将该布局另存为一个布局配置文件使用,可以省略重新新建布局重新来一次大的调整的工作 ...

  10. Qt编写数据可视化大屏界面电子看板3-新建布局

    一.前言 能够新建布局,也是数据可视化大屏界面电子看板系统中的必备功能之一,新建布局这样的功能一般做到右键菜单中,单击新建布局菜单,弹出输入框要求输入新的布局的名称,为了更符合国情,直接支持中文名称, ...

随机推荐

  1. apache安装详解

    Apache安装 准备工作. 首先在C盘根目录下创建一个名为web的文件夹作为php开发环境的安装位置,并在web文件夹中创建apache24子文件夹,将apache解压后文件放至此处. 安装包 首先 ...

  2. 云原生周刊:一条 Kubernetes 命令引发的悲剧

    开源项目 KSail 用于在 Docker 中配置支持 GitOps 的 K8s 集群的 CLI 工具. nginx-gateway-fabric NGINX Gateway Fabric 是一个开源 ...

  3. 开启 Calico eBPF 数据平面实践

    简介 Calico 从 v3.13 开始,集成了 eBPF 数据平面. 关于什么是 eBPF, 以及 Calico 为什么引入了 eBPF , 并不是本篇文章的重点,感兴趣的朋友可以自行阅读相关文档. ...

  4. Kafka社区KIP-500中文译文(去除ZooKeeper)

    原文链接:https://cwiki.apache.org/confluence/display/KAFKA/KIP-500%3A+Replace+ZooKeeper+with+a+Self-Mana ...

  5. 今日一学,5道大厂的Java基础面试题

    前言 各种框架眼花缭乱,各种逻辑需求,CRUD.久而久之,写的1000行代码中都是if else,@autowired等等,等出去面试的时候,基础题不断,而且还是不常用,或者说不在意的,往往这些就容易 ...

  6. 通过串口与ModBus硬件设备通信

    探头与变送器 前面的文章已经实现了ModBus客户端与服务端和他们之间的通信.但只是软件不够,毕竟传感器是硬件. 经过我的了解,一个完整的实现了Modbus协议的,并且通过RS485电缆与电脑交换Mo ...

  7. .NET 创建动态方法方案及 Natasha V9

    前言 本篇文章前面客观评估了 .NET 创建动态方方案多个方面的优劣,后半部分是 Natasha V9 的新版特性. .NET 中创建动态方法的方案 创建动态方法的不同选择 以下陈列了几种创建动态方法 ...

  8. TAMAYA

    TAMAYA 挺有意思的维护题. 题面 n个小夫坐成一排,每个小夫有一个真实值vi.小夫们有m场聚会,第i次聚会会在编号为 [li, ri] 的小夫中举办. 聚会之后,这些小夫的真实值会变为他们之中的 ...

  9. CF207C3 Game with Two Trees

    CF207C3 Game with Two Trees 妙到家的树上字符串问题. 约定 树 \(1\):\(t_1\). 树 \(2\):\(t_2\). \(S_{1/2}(i,l)\) 为树 \( ...

  10. curl访问etcd报错unable to set private key file

    [appdeploy@1a32vla0168zzzz cfssl]$ curl -i https://xxx.xxx.xxx.5:2379/health --cacert /app/etcd/cfss ...