Qt编写数据可视化大屏界面电子看板11-自定义控件-银行转账凭条

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

简介: 一、前言说到自定义控件,我是感觉特别熟悉的几个字,本人亲自原创的自定义控件超过110个,都是来自各个行业的具体应用真实需求,而不是凭空捏造的,当然有几个小控件也有点凑数的嫌疑,在编写整个数据可视化大屏界面电子看板系统中,也用到了四五个自定义的控件,比如那个环形百分比图,多态进度条,合格率仪表盘,速度仪表盘等,这些控件在现有的类中是没有的,需要用QPainter这个牛逼的工具来绘制,类似于神笔马良似的,给我一个画笔,可以画出任意你想要的图形,好比我常说的心中有坐标,万物皆painter。

一、前言

说到自定义控件,我是感觉特别熟悉的几个字,本人亲自原创的自定义控件超过110个,都是来自各个行业的具体应用真实需求,而不是凭空捏造的,当然有几个小控件也有点凑数的嫌疑,在编写整个数据可视化大屏界面电子看板系统中,也用到了四五个自定义的控件,比如那个环形百分比图,多态进度条,合格率仪表盘,速度仪表盘等,这些控件在现有的类中是没有的,需要用QPainter这个牛逼的工具来绘制,类似于神笔马良似的,给我一个画笔,可以画出任意你想要的图形,好比我常说的心中有坐标,万物皆painter。

自定义控件为了适应整体换肤,需要用Q_PROPERTY类指定,类似于元对象,用Q_PROPERTY指定的东西,可以直接样式表控制,比如GaugePercent{qproperty-baseColor:#FF0000;}就可以对所有的GaugePercent类进行颜色更换,而且是动态更换,用Q_PROPERTY指定的东西还可以直接出现在Qtcreator的右侧属性栏,直接修改属性即可,所见即所得,非常方便。

二、电子看板介绍

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

三、功能特点

  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=x81eax5b9ax4e49x98cex683c 即可。此时打开软件会应用配置文件中的颜色。
  8. 右键菜单可以截图保存,默认命名为 配色方案名称_布局方案名称.png 保存在snap目录下。
  9. 如果是XP系统请先执行fixff.cmd,用来修复ffmpeg在XP上不可用的BUG。
  10. 在二级窗体的标题栏上右键弹出模块菜单,可以对单个模块打开关闭,其他地方右键全局菜单。
  11. 可执行文件下载地址:https://pan.baidu.com/s/1o97IGvZgTgDhlkuXQa4B0w 提取码:r2bv。
  12. 会不定期更新程序,欢迎各位提出批评和建议。

六、效果图

_1

七、核心代码

void ProgressRing::paintEvent(QPaintEvent *)
{
    int width = this->width();
    int height = this->height();
    int side = qMin(width, height);

    //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.translate(width / 2, height / 2);
    painter.scale(side / 200.0, side / 200.0);

    //绘制背景
    drawBg(&painter);
    //绘制进度
    drawRing(&painter);

    //绘制间隔,重新绘制一个圆遮住,产生间距效果
    if (ringPadding > 0) {
        drawPadding(&painter);
    }

    //绘制中间圆
    drawCircle(&painter);
    //绘制当前值
    drawValue(&painter);
}

void ProgressRing::drawBg(QPainter *painter)
{
    int radius = 99;
    painter->save();
    painter->setPen(Qt::NoPen);
    //这里有个技巧,如果没有间距则设置成圆环的背景色
    painter->setBrush(ringPadding == 0 ? ringBgColor : bgColor);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}

void ProgressRing::drawRing(QPainter *painter)
{
    int radius = 99 - ringPadding;
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(ringColor);

    QRectF rect(-radius, -radius, radius * 2, radius * 2);

    //计算总范围角度,当前值范围角度,剩余值范围角度
    double angleAll = 360.0;
    double angleCurrent = angleAll * ((currentValue - minValue) / (maxValue - minValue));
    double angleOther = angleAll - angleCurrent;

    //如果逆时针
    if (!clockWise) {
        angleCurrent = -angleCurrent;
        angleOther = -angleOther;
    }

    //动态设置当前进度颜色
    QColor color = ringColor;
    if (alarmMode == 1) {
        if (currentValue >= ringValue3) {
            color = ringColor3;
        } else if (currentValue >= ringValue2) {
            color = ringColor2;
        } else {
            color = ringColor1;
        }
    } else if (alarmMode == 2) {
        if (currentValue <= ringValue1) {
            color = ringColor1;
        } else if (currentValue <= ringValue2) {
            color = ringColor2;
        } else {
            color = ringColor3;
        }
    }

    //绘制当前值饼圆
    painter->setBrush(color);
    painter->drawPie(rect, (startAngle - angleCurrent) * 16, angleCurrent * 16);

    //绘制剩余值饼圆
    painter->setBrush(ringBgColor);
    painter->drawPie(rect, (startAngle - angleCurrent - angleOther) * 16, angleOther * 16);

    painter->restore();
}

void ProgressRing::drawPadding(QPainter *painter)
{
    int radius = 99 - ringWidth - ringPadding;
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(bgColor);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}

void ProgressRing::drawCircle(QPainter *painter)
{
    //文字的区域要减去进度的宽度及间距
    int radius = 99 - ringWidth - (ringPadding * 2);
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(circleColor);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}

void ProgressRing::drawValue(QPainter *painter)
{
    //文字的区域要减去进度的宽度及间距
    int radius = 99 - ringWidth - (ringPadding * 2);
    painter->save();
    painter->setPen(textColor);

    QFont font;
    int fontSize = radius - (showPercent ? 20 : 6);
    font.setPixelSize(fontSize);
    painter->setFont(font);

    QRectF textRect(-radius, -radius, radius * 2, radius * 2);
    QString strValue;
    if (showPercent) {
        double percent = (currentValue * 100) / (maxValue - minValue);
        strValue = QString("%1%").arg(percent, 0, 'f', precision);
    } else {
        strValue = QString("%1").arg(currentValue, 0, 'f', precision);
    }

    //如果定义了显示的文字则优先显示
    strValue = text.isEmpty() ? strValue : text;
    painter->drawText(textRect, Qt::AlignCenter, strValue);

    painter->restore();
}
相关文章
|
6月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
181 0
|
4月前
|
编译器
【项目开发】QT简单练习之QQ登录界面模仿
为了进一步加深对QT开发的理解,在学习完基础操作之后要进行一个简单的练习。
|
9月前
|
编解码 C++
Qt第一课 第一个ui界面
Qt第一课 第一个ui界面
125 2
|
9月前
|
区块链
【qt】最快的开发界面效率——混合编程3
【qt】最快的开发界面效率——混合编程
119 1
|
9月前
【qt】最快的开发界面效率——混合编程2
【qt】最快的开发界面效率——混合编程
102 1
|
9月前
【qt】设计器实现界面
【qt】设计器实现界面
65 1
|
9月前
|
搜索推荐
【qt】自定义界面类
【qt】自定义界面类
84 0
|
9月前
|
数据可视化 开发工具 C++
Qt Creator 界面
Qt Creator 界面
|
9月前
|
Windows
解决windows下Qt Creator显示界面过大的问题
解决windows下Qt Creator显示界面过大的问题
|
9月前
【qt】最快的开发界面效率——混合编程1
【qt】最快的开发界面效率——混合编程
98 0

热门文章

最新文章

相关内容推荐

购房收款回执单等于收据吗致家长的一封信回执单回复河南农商银行转账小票模板2022年童心向党红色阅读回执单怎么写中山居住证回执单有效期公司发票签收回执单表格模板转账受理没有凭条公积金卡需要回执单吗银行柜台转账小票假立案撤销回执单150万转账凭条手机转账怎样找回执单报过案警察给回执单吗过户没有回执单银行现金转账后有小票吗存取五万元登记银行是否有回执单给客户中行转账凭条怎么补办警察会为了500给回执单吗银行回执单怎么登记入账邮政自助银行转账忘记打凭条卡挂失回执单银行转账小票怎么拉银行存款机转账忘记打小票商丘中原银行转账凭条银行无卡转账有小票吗东莞居住回执单大学生贷款回执单办房产证的回执单为什么给售楼部atm机转账不能打小票甲方问题处理回执单银行汇款转账小票在哪里顺丰快递回执单银行转账有小票吗离婚回执单法院出还是自己出农行一万二转账小票图片手机网银转账如何打印小票邮政没有转账能打印凭条吗对账回执单农业银行回执单什么样的宝鸡暂住证的回执单可以上牌吗1000元小票转账截图24小时银行转账打凭条认真阅读工作提示和回执单通知银行转账小票上显示交易超时受案回执单重要吗2021年的收获回执单转账atm小票vba邮件回执单怎么获取银行转账小票三年前的转账小票抄水表回执单跨行转账小票怎么取居住证回执单可以办理失业登记吗手机转账从哪里看转账回执单邮政转账小票图片无卡转账现金被吞无小票转账凭条怎么用法招商银行转账凭条图片办理安全许可证的回执单渝北民政局离婚回执单社保回执单要填写吗建设银行的回执单车辆过户回执单幼儿园安全建议回执单社保回执单怎么弄5万元银行转账的小票建设银行ATM机转账打印凭条柜台转账出来的小票有没有假网银建设银行转账单子凭条认刊回执单包头农村信用社电子回执单回执单丢了怎么报警健康证电子回执单高中直播授课通知回执单怎么填农业银行转账小票模拟器转账支票小票遗失怎么办回执单怎么办转账凭条算证据吗建设银行柜台转账小票图片建行手机转账打印凭条atm转账没打凭条怎么看发票签收回执单如何回传银行汇款转账小票回执单怎么复印派出所报案回执单图片查询中国银行网上转账回执单图片交了诉讼费没有回执单和票据珠海申请仲裁立案有回执单吗10000元小票转账截图如何获得银行转账小票兵役登记回执单怎么打印告知书和回执单区别恋舞回执单atm转账凭条怎么补寒假家长回执单报案回执单图片被强制执行扣钱有回执单吗公积金回执单最晚什么时候交回农商银转账小票离婚登记申请受理回执单有几份回执单的格式及范文证人回执单廉政家书回执单自助柜员机转账凭条百色出广东要回执单离婚登记回执单掉了怎么办在柜员机转账小票有用吗检察院回执单哪种邮寄方式学生参加社会实践回执单建设银行转账小票图片6东盛路小学学生回执单支付宝花呗回执单怎么获得保险公司转账凭条业务员代签名惠州各种回执单照片样本银行把存款回执单拿走有影响吗设置延时到账回执单有显示吗山东东营核酸检测回执单新会回执单办理需要什么资料银行回执单图银行转账30万小票农村信用社22万转账凭条中学生健康回执单家长寄语建行企业转账怎么看电子回执单查银行转账记录能打凭条吗自动取款机转账小票模糊了刑侦立案没有回执单atm转账交易凭条样板银行转账凭条客户回单保险回执单签了可以退嘛师范毕业生需要给回执单么外派实习的回执单填写保险回执单ATM转账小票鉴别签字版回执单扫描件怎么弄报案回执单能不能给别人看无卡转账没小票自助机转账小票能造假吗居住证明回执单当天能打吗转账回执单英文打款 回执单图片公户转账有小票么银行转账成功小票图片居住证回执单有什么用公积金回执单怎样寄回廉江市农业银行回执单有地址吗刑事立案后多久给回执单自助银行转账打印凭条花钱吗安全生产回执单潍坊取居住证需要回执单吗回执单代签转账凭条丢了对方怎么办支付宝转账能打印小票吗报案受理回执单两个新农合医保停保回执单北京拿居住证回执单可以办临牌吗开户回执单银行的转账小票可以补回来吗2020寒假回执单范文回执单的日期居住证回执单办理流程学校怎么查社保缴费回执单有银行卡转账小票可以起诉吗银行atm转账小票社保回执单丢失平顶山市生育保险回执单支付宝转账怎么查回执单建设银行转账纪录小票托育机构备案回执单怎么下载工资打到银行卡要哪种回执单pos机打回执单工商电子回执单查不到atm机转账凭条做假怎么打印银行转账的小票领身份证要不要回执单立案回执单图片离婚登记受理回执单遗失了怎么办手机转账怎么打小票吗回执单还没有出退役军人拿档案需要回执单吗国家开发银行回执单电子版转账pos小票没有回执单不能强制执行吗助学贷款提额成功还要回执单吗社保回执单怎么做假银行转账30万小票支付宝转账怎么查回执单工行atm转账小票制作工商银行转账纸质回执单寒假家长回执单招商银行交通处罚回执单格式转账首付款凭条网上转账有凭条吗转账小票丢了怎么追回来离婚登记回执单掉了怎么办营业执照注销后要拿回执单吗差回执单银行柜员机转账凭条在线制作新冠疫苗回执单为什么查不到派出所受案回执单上名字北京办银行转账凭证回执单

合作伙伴

银行转账凭条

龙岗网络公司
深圳网站优化
龙岗网站建设
坪山网站建设
百度标王推广
天下网标王
SEO优化按天计费
SEO按天计费系统