一、前言

数据采集是整个数据可视化大屏界面电子看板系统核心功能,没有数据源,这仅仅是个玩具UI,没啥用,当然默认做了定时器模拟数据,产生随机数据,这个可以直接配置文件修改来选择采用何种数据采集方法,总结了一下基本上会有这样几种数据源,timer-模拟数据 db-数据库采集 tcp-网络采集 http-post请求,大量的web会选择采用http作为post网络请求来获取数据,而对于本人来说,更喜欢用数据库作为数据源,这样可以避免很多扯皮的事情,比如请求出错或者得到错误的数据等,而数据库是死的,不涉及到其他任何程序的干扰,也不需要做任何对接,只要规范好数据库表和字段即可。

本系统默认采用mysql数据库,当然也支持其他数据,甚至包括了sqlite这种小众的数据库,Qt对数据库的封装也是非常完美的,反正在我使用的这些年过程中,没有发现过什么BUG或者事故,Qt提供了一个统一的数据库接口,这对于程序员来说是巨大的福音,比如查询数据库,QSqlQuery查询的结果,统一用query.value(i)或者,这个数据是通用类型,可以转换成你想要的数据类型,这样就拓展性和兼容性非常强大了。

在本系统中,各个模块的采集间隔都可以自由定义,默认5秒钟采集一次,我采用的办法是,开启一个线程,在线程中打开数据,然后提供方法插入要执行的sql语句,插入的同时记得给定标识符,以便返回结果的时候标识,这样就形成了一个万能的方法,自动排队,也不会说冲突之类的,一个类管理所有的数据库采集,文字末尾会贴出完整代码。

二、电子看板介绍

电子看板是目视化管理的一种表现形式,即对数据的状况一目了然地表现,主要是对于管理项目,它通过利用形象直观而又色彩适宜的各种视觉感知信息来组织现场生产活动,目视管理依据人类的生理特征,在生产现场充分利用信号灯、标识牌、符号颜色等方式来发出视觉信号,鲜明准确地刺激人的神经末梢,快速地传递信息,形象直观地将潜在的问题和浪费现象都显现出来。以便任何人都可以及时掌握管理现状和必要的情报,从而能够快速制定并实施应对措施。因此,管理看板是发现问题、解决问题的非常有效且直观的手段,是优秀的现场管理必不可少的工具之一。

三、功能特点

  1. 整体总共分三级界面,一级界面是整体布局,二级界面是单个功能模块,三级界面是单个控件。
  2. 子控件包括饼图+圆环图+曲线图+柱状图+柱状分组图+横向柱状图+横向柱状分组图+合格率控件+百分比控件+进度控件+设备状态面板+表格数据+地图控件(包括动态闪烁点+迁徙图等)+视频控件+其他控件等。
  3. 二级界面可以自由拖动悬浮,支持最小化最大化关闭,响应双击自定义标题栏。
  4. 数据源支持数据库采集(默认)、网络通信、网络请求等,可自由设定每个子界面的采集间隔即数据刷新频率。
  5. 采用纯QWidget编写,支持Qt4.6到Qt5.12.3任何版本,支持嵌入式linux比如树莓派、香橙派、全志、imx6等。
  6. 提供三个内核版本,自定义控件版本+qchart版本+echart版本。
  7. 内置多套配色风格样式,默认紫色,支持任何分辨率。
  8. 可设置标题+目标分辨率+布局方案,启动立即应用。
  9. 可设置主背景颜色+面板颜色+十字线游标颜色。
  10. 可设置多条曲线颜色,没有设置颜色的情况下内置15套精美颜色随机应用。
  11. 可设置标题栏背景颜色+文字颜色。
  12. 可设置曲线图表背景颜色+文字颜色+网格颜色。
  13. 可设置正常颜色+警戒颜色+报警颜色+禁用颜色+百分比进度颜色。
  14. 可分别设置各种字体大小,比如全局+软件名称+标题栏+子标题栏+加粗标签等。
  15. 可设置标题栏高度+表头高度+行高度。
  16. 曲线支持游标+悬停高亮数据点和显示值,柱状图支持顶部(可设置顶端+上部+中间+底部)显示数据,全部自适应计算位置。
  17. 主界面直接鼠标右键切换布局+配色方案+关闭开启某个二级窗体。
  18. 自动记忆所有子窗口的大小和位置,下次启动立即应用。
  19. 动态加载布局方案菜单,可以动态新建布局、恢复布局、保存布局、另存布局等,用户可以制造任意布局。
  20. 二级窗体,双击从主窗体分离出来浮动,可以自由调整大小。再次双击标题栏最大化,再次双击还原。
  21. 每个模块都可以自定义采集速度,如果是数据库采集会自动排队处理。

四、配置文件说明

(1)、基本配置参数

字段 描述 默认值
WorkMode 工作模式 timer-模拟数据 db-数据库采集 tcp-网络采集 http-post请求 db
MapStyle 中间地图样式 image-静态图片 point-闪烁点 move-迁徙图 point
Title 软件标题,显示在软件中间顶部 数字化工厂信息中心
Ratio 分辨率,目前无意义 4096*216
Layout 布局方案,每次切换布局方案以后都会保存 完整布局
Theme 配色方案,每次切换配色方案以后都会保存 紫色风格
VideoAddr 视频流地址,视频模块播放的视频地址 凤凰卫视
AutoRun 是否开机启动 false
MoveEnable 模块是否可以拖动,启用以后模块可以任意拖动 true
CutLeftBottom 底部布局左侧是否切掉 true
CutRightBottom 底部布局右侧是否切掉 true
StaticLine 是否绘制静态定位线,为假则绘制游标十字线 true
ShowPercent Y轴是否显示百分比 true
StepY Y轴大尺度步长 6
CursorHideTime 用户不操作鼠标自动隐藏鼠标的时间间隔,单位秒 5

(2)、颜色配置参数

字段 描述 默认值
ColorMainBg 主背景颜色 QColor(4, 7, 38)
ColorPanelBg 面板背景颜色 QColor(26, 29, 60)
ColorLine 十字线定位线颜色 QColor(255, 0, 0)
ColorLine1 线条1颜色 QColor(0, 176, 180)
ColorLine2 线条2颜色 QColor(32, 159, 223)
ColorLine3 线条3颜色 QColor(255, 192, 0)
ColorTitleBg 标题栏背景颜色 QColor(48, 48, 85)
ColorTitleText 标题栏文字颜色 QColor(255, 255, 255)
ColorChartBg 曲线图表背景颜色 QColor(38, 41, 74)
ColorChartText 曲线图表文字颜色 QColor(250, 250, 250)
ColorChartGrid 曲线图表网格颜色 QColor(180, 180, 180)
ColorOk 正常颜色 QColor(0, 176, 180)
ColorLow 警戒颜色 QColor(255, 192, 0)
ColorAlarm 报警颜色 QColor(214, 77, 84)
ColorDisable 禁用背景颜色 QColor(210, 210, 210)
ColorPercent 环形百分比背景颜色 QColor(0, 254, 254)

(3)、字体和尺寸配置参数

字段 描述 默认值
MainFont 全局字号 微软雅黑,12
NameFont 软件名称字号 19
LabFont 加粗标签字号 12
DeviceFont 设备面板字号 12
SubTitleFont 模块子标题栏字号 13
TitleFont 模块标题栏字号 15
TitleHeight 模块标题栏高度 23
HeadHeight 表格表头高度 28
RowHeight 表格行高度 25

(4)、采集速度配置参数,单位毫秒

字段 描述 默认值
IntervalModule1 模块1采集间隔 5000
IntervalModule2 模块2采集间隔 5000
IntervalModule3 模块3采集间隔 5000
IntervalModule4 模块4采集间隔 5000
IntervalModule5 模块5采集间隔 5000
IntervalModule6 模块6采集间隔 5000
IntervalModule7 模块7采集间隔 5000
IntervalModule8 模块8采集间隔 5000

(5)、本地数据库配置参数

字段 描述 默认值
LocalDBType 本地数据库类型,Sqlite、Mysql等 Mysql
LocalDBIP 本地数据库主机地址 127.0.0.1
LocalDBPort 本地数据库端口 3306
LocalDBName 本地数据库名称 bigscreen
LocalUserName 本地数据库用户名 root
LocalUserPwd 本地数据库密码 root

五、特别说明

  1. 可执行文件同级文件夹有layout+layout_1440+layout_1920,程序默认自动识别分辨率并加载对应的布局文件夹,比如1920分辨率则从layout_1920文件夹加载布局,并作为整体布局文件夹。
  2. 程序默认是模拟数据,如果需要从数据库采集则修改配置文件WorkMode=db即可。
  3. 如果发现布局拖动乱了,可以直接鼠标右键选择恢复布局即可,在保存布局以前。
  4. 在中间地图模块鼠标右键可以弹出菜单,切换布局和配色方案等。
  5. 在模块的标题栏上右键可以弹出默认的dock菜单,用来显示和隐藏各模块。
  6. 软件关闭过程中会自动保存布局,下次启动以后自动应用。
  7. 如果使用的默认的默认的配色方案比如紫色风格,则配置文件中的颜色全部无效,会自动应用代码中的颜色,如果需要启用自定义的颜色,则将配置文件的 Theme=\x81ea\x5b9a\x4e49\x98ce\x683c 即可。此时打开软件会应用配置文件中的颜色。
  8. 右键菜单可以截图保存,默认命名为 配色方案名称_布局方案名称.png 保存在snap目录下。
  9. 如果是XP系统请先执行fixff.cmd,用来修复ffmpeg在XP上不可用的BUG。
  10. 在二级窗体的标题栏上右键弹出模块菜单,可以对单个模块打开关闭,其他地方右键全局菜单。
  11. 可执行文件下载地址:https://pan.baidu.com/s/1o97IGvZgTgDhlkuXQa4B0w 提取码:r2bv。
  12. 会不定期更新程序,欢迎各位提出批评和建议。

六、效果图

七、核心代码

#include "datadb.h"
#include "quiwidget.h"QScopedPointer<DataDb> DataDb::self;
DataDb *DataDb::Instance()
{if (self.isNull()) {static QMutex mutex;QMutexLocker locker(&mutex);if (self.isNull()) {self.reset(new DataDb);}}return self.data();
}DataDb::DataDb(QObject *parent) : QThread(parent)
{stopped = false;dbOkLocal = false;errorCount = 0;lastCheckTimeLocal = QDateTime::currentDateTime();checkConn = false;checkInterval = 30;dbTypeLocal = DbType_MySql;connNameLocal = "qt_sql_default_connection";hostNameLocal = "127.0.0.1";portLocal = 3306;dbNameLocal = "db_mysql";userNameLocal = "root";userPwdLocal = "root";connect(this, SIGNAL(error(QString)), this, SLOT(doError(QString)));
}DataDb::~DataDb()
{this->stop();this->wait();
}void DataDb::run()
{//打开数据库openDb();msleep(1000);while(!stopped) {//定时执行一次校验数据库连接是否正常QDateTime now = QDateTime::currentDateTime();if (checkConn && lastCheckTimeLocal.secsTo(now) >= checkInterval) {checkDb();lastCheckTimeLocal = now;continue;}//如果数据库连接正常则处理数据,不正常则重连数据库if (!dbOkLocal) {if (errorCount >= 3) {closeDb();msleep(3000);openDb();emit debug(QString("重连本地数据库%1").arg(dbOkLocal ? "成功" : "失败"));msleep(3000);}} else {//取出队列sql语句执行if (tags.count() > 0) {//从最前面开始取QMutexLocker locker(&mutex);QString tag = tags.takeFirst();QString sql = sqls.takeFirst();//qDebug() << TIMEMS << tag << sql;QSqlQuery query(dbConnLocal);if (query.exec(sql)) {QStringList data;while(query.next()) {int count = query.record().count();for (int i = 0; i < count; i++) {data << query.value(i).toString();}}emit receiveData(tag, data);}}msleep(10);}}stopped = false;
}void DataDb::doError(const QString &msg)
{QUIHelper::showMessageBoxError(msg, 3);
}bool DataDb::openDb()
{//可以自行增加其他数据库的支持if (dbTypeLocal == DbType_Sqlite) {dbConnLocal = QSqlDatabase::addDatabase("QSQLITE", connNameLocal);dbConnLocal.setDatabaseName(dbNameLocal);} else if (dbTypeLocal == DbType_MySql) {dbConnLocal = QSqlDatabase::addDatabase("QMYSQL", connNameLocal);dbConnLocal.setConnectOptions("MYSQL_OPT_RECONNECT=1;MYSQL_OPT_CONNECT_TIMEOUT=1;MYSQL_OPT_READ_TIMEOUT=1;MYSQL_OPT_WRITE_TIMEOUT=1");dbConnLocal.setHostName(hostNameLocal);dbConnLocal.setPort(portLocal);dbConnLocal.setDatabaseName(dbNameLocal);dbConnLocal.setUserName(userNameLocal);dbConnLocal.setPassword(userPwdLocal);}errorCount = 0;dbOkLocal = dbConnLocal.open();if (!dbOkLocal) {emit error("打开数据库失败!请检查用户名和密码是否正确!");}return dbOkLocal;
}bool DataDb::checkDb()
{QDateTime dtStart = QDateTime::currentDateTime();QString sql = "select 1";QSqlQuery query(dbConnLocal);dbOkLocal = query.exec(sql);dbOkLocal ? (errorCount = 0) : errorCount++;QDateTime dtEnd = QDateTime::currentDateTime();double ms = dtStart.msecsTo(dtEnd);emit debug(QString("检查本地数据库连接(共 %1 条/用时 %2 秒)").arg(1).arg(QString::number(ms / 1000, 'f', 3)));return dbOkLocal;
}void DataDb::closeDb()
{dbConnLocal.close();QSqlDatabase::removeDatabase(connNameLocal);dbOkLocal = false;emit debug("关闭本地数据库");
}void DataDb::stop()
{stopped = true;
}void DataDb::setConnInfo(DataDb::DbType dbType, const QString &connName,const QString &hostName, int port, const QString &dbName,const QString &userName, const QString &userPwd)
{this->dbTypeLocal = dbType;this->connNameLocal = connName;this->hostNameLocal = hostName;this->portLocal = port;this->dbNameLocal = dbName;this->userNameLocal = userName;this->userPwdLocal = userPwd;
}void DataDb::setCheckConn(bool checkConn)
{this->checkConn = checkConn;
}void DataDb::setCheckInterval(int checkInterval)
{if (checkInterval > 5 && this->checkInterval != checkInterval) {this->checkInterval = checkInterval;}
}QSqlDatabase DataDb::getDb()
{return dbConnLocal;
}bool DataDb::getOk()
{return dbOkLocal;
}void DataDb::select(const QString &tableName, const QString &columnName, bool append)
{//超过队列中最大数量限制则无需处理QMutexLocker locker(&mutex);if (tags.count() < 100) {//如果是append表示追加在队列末尾,否则插到最前面优先级最高if (append) {tags << tableName;sqls << QString("select %1 from %2").arg(columnName).arg(tableName);} else {tags.insert(0, tableName);sqls.insert(0, QString("select %1 from %2").arg(columnName).arg(tableName));}}
}

转载于:https://www.cnblogs.com/feiyangqingyun/p/10906458.html

Qt编写数据可视化大屏界面电子看板12-数据库采集相关推荐

  1. Qt编写数据可视化大屏界面电子看板1-布局方案

    一.前言 布局方案在整个数据可视化大屏界面电子看板系统中,是除了基础功能以外的核心功能之一,只有具备了布局方案这个功能,才能让用户随意调整自己想要的布局,保存成自定义名称的布局配置文件,这样就大大增加 ...

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

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

  3. Qt编写数据可视化大屏界面电子看板10-改造QCustomPlot

    一.前言 为了抛弃对QChart的依赖,以及echart的依赖,(当然,后期也会做qchart的版本和echart的版本,尤其是echart的版本是肯定会做的,毕竟echart的效果牛逼的一塌糊涂,全 ...

  4. Qt制作大数据可视化大屏展示电子看板

    Qt制作大数据可视化大屏展示电子看板 解决当前最火的大数据可视化大屏展示,整个项目通过Qt开发,集成了QML/QChart/ECharts及自定义控件等模块,所有的可视化控件都可以集成到其中.可以随意 ...

  5. 几张大数据可视化大屏界面设计

    更多后台界面设计分享:http://www.uimaker.com/uimakerhtml/uidesign/uibs/

  6. YYDatav的数据可视化大屏《精彩案例汇总》(PythonEcharts源码)

    一. 资源下载 [1-10]套Python+Echarts数据可视化大屏案例(共10套)-企业管理文档类资源-CSDN下载第1篇https://yydatav.blog.csdn.net/articl ...

  7. 基于JavaScript+Koa2实现 Echarts 电商平台数据可视化大屏全栈【100010415】

    全新 Echarts 电商平台数据可视化大屏全栈 1. 前言 五一假期重学了新版 Echarts,一个基于 JavaScript 的开源可视化图表库,收集参考了很多网上资料,最终选择电商平台作为练手项 ...

  8. 数据大屏产品介绍PPT_有这些图表美化工具,十分钟配出炫酷的数据可视化大屏...

    有这些图表美化工具,十分钟配出炫酷的数据可视化大屏 数据可视化难,试试这些图表美化 图表可视化,是很多同学头疼的问题,因此找到一款操作简便,少花钱,可编辑数据,导出样式多的图表生成网站迫在眉睫. 1. ...

  9. 数据可视化大屏设计经验分享 【进阶篇】

    前言 说起数据可视化设计,如今绝对是热门的设计之一,而真正懂数据可视化设计的设计师却不多,随着大数据产业的蓬勃发展,很多企业都开始应用数据可视化.很多UI设计师突然会接到公司数据可视化设计的需求,如果 ...

最新文章

  1. 二维数组更改vue_使用vue中的v-for遍历二维数组的方法
  2. Exadata X2-2 vs EMC Greenplum DCA vs Netezza TwinFin 12主要配置大对比
  3. Redis事件管理(三)
  4. 【CyberSecurityLearning 18】ACL及实验演示
  5. 继涉黄被约谈 “比心陪练”App因内容涉宣扬暴力再被处罚
  6. python怎么创意出字符图形_创造课程系列:Python入门
  7. 在Python程序中设置函数最大递归深度
  8. 占内存小的android浏览器,一点浏览器占内存吗 世界最小浏览器使用评测
  9. 高通WIFI模块QCA9377 调试
  10. 深入浅出MFC.pdf
  11. 好看的php表格样式,四个好看的CSS样式表格 | 学步园
  12. ElasticSearch:text和keyword的区别、fileds作用、mappings结构对查询的影响
  13. 求1000以内的水仙花数
  14. 上海宝付知识普及:个人信用到底多重要?
  15. 高斯消元法(matlab)
  16. java中linux下反斜杠,Linux下反斜杠号\引发的思考
  17. MATLAB——拉氏变换及反其变换、Z变换及其反变换
  18. java语言保留结构和联合_在下列概念中, Java 语言只保留了
  19. 开心网首次起诉千橡 称山寨做法为不正当竞争
  20. matlab画波传播,科学网-MATLAB绘制波包曲线-李金磊的博文

热门文章

  1. 什么影响了数据库的性能?
  2. cocos2d-x 日志...
  3. 关于一次装机后的个人总结
  4. 文件锁操作《精通Unix下C语言编程与项目实践》之三
  5. Linux 对应ARP欺骗的一种被动方法[转]
  6. idea 与springboot 快捷键
  7. java基础File的简单使用记录
  8. TCP/IP 学习 --- 2
  9. Unity C# 设计模式(一)单例模式
  10. ansible暂停模块