• 456阅读
  • 0回复

Qt监控设备离线检测/实时监测设备上下线/显示不同的状态图标/海康大华宇视华为监控系统 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 02-09


## 一、前言说明
监控系统中一般有很多设备,有些用户希望知道每个设备是否已经上线,最好有不同的状态图标提示,海康的做法是对设备节点的图标和颜色变暗处理,离线的话就变暗,有可能是加了透明度,而大华的处理是有个清晰的图标表示,上线图标右下角有个绿色指示灯,离线的右下角是个圆形的叉叉,如果右侧监控视频通道已经打开过,则又是一个带打开了的图标,非常直观,文字颜色可以不用去变,三种图标切换,这是目前为止看到的最完美的处理方案,于是也按照这个方案来实施。

之前做设备多级分组的时候,就已经把各种设备树对应的功能单独拆分完整,每个函数都单独干自己的事情,比如第一步就是根据分组配置信息生成分组的treewidget结构。第二步就是逐个遍历所有分组节点,查找摄像机表中是否有该分组的子设备,有的话则插入子节点。第三步是遍历所有节点设置图标,分组是分组的图标,摄像头是摄像头的图标,后面还可以自行区分是枪机还是球机或者其他类型的设备。第四步是读取配置文件展开最后展开的节点。总共四步才算完成,每个函数干干净净只干自己的事情,之前全部在一个函数中实现,不易于管理和拓展,比如需要区分不同的图标。

## 二、效果图



## 三、相关代码
```cpp
#include "deviceicon.h"
#include "devicetree.h"
#include "qthelper.h"
#include "iconhelper.h"

QMap<QString, QPixmap> DeviceIcon::icons = QMap<QString, QPixmap>();
void DeviceIcon::initIcon()
{
    if (icons.count() > 0) {
        icons.clear();
    }

    //图标的大小和宽高
    int size = 22;
    int width = size + 2;
    int height = size + 2;

    //可以自行查找对照表改成不同的图标/还可以增加不同的图标用来区分枪机球机等
    QString colorOn = GlobalConfig::TextColor;
    QString colorOff = AppConfig::ColorIconAlarm;
    icons.insert("nvr", IconHelper::getPixmap(colorOn, 0xe9ef, size, width, height));
    icons.insert("group", IconHelper::getPixmap(colorOn, 0xea24, size + 1, width, height));
    icons.insert("ipcOn", IconHelper::getPixmap(colorOn, 0xea07, size + 2, width, height));
    icons.insert("ipcOff", IconHelper::getPixmap(colorOff, 0xea0a, size, width, height));
    icons.insert("subOn", IconHelper::getPixmap(colorOn, 0xe9ff, size, width, height));
    icons.insert("subOff", IconHelper::getPixmap(colorOff, 0xea0a, size, width, height));
}

QPixmap DeviceIcon::getIcon(const QString &key)
{
    return icons.value(key);
}

QPixmap DeviceIcon::getGroupIcon(const QString &text)
{
    //如果是录像机信息表中的则设置成NVR图标
    int index = DbData::NvrInfo_NvrName.indexOf(text);
    if (index >= 0) {
        return icons.value("nvr");
    } else {
        return icons.value("group");
    }
}

void DeviceIcon::initTreeIcon(QTreeWidget *treeWidget, bool checkOffline)
{
    if (treeWidget->topLevelItemCount() == 0) {
        return;
    }

    //不同的节点显示不同的图标
    QPixmap iconIpc = icons.value(checkOffline ? "ipcOff" : "ipcOn");
    QPixmap iconSub = icons.value(checkOffline ? "subOff" : "subOn");

    QTreeWidgetItemIterator it(treeWidget);
    while (*it) {
        QTreeWidgetItem *item = (*it);
        ++it;

        QString text = item->text(0);
        if (text == "主码流" || text == "子码流") {
            item->setIcon(0, iconSub);
        } else if (item->data(0, Qt::UserRole + 1).toBool()) {
            item->setIcon(0, iconIpc);
        } else {
            item->setIcon(0, getGroupIcon(text));
        }
    }
}

void DeviceIcon::setTreeIcon(QTreeWidget *treeWidget, const QString &url, bool online)
{
    if (treeWidget->topLevelItemCount() == 0) {
        return;
    }

    //不同的节点显示不同的图标
    QPixmap iconIpc = icons.value(online ? "ipcOn" : "ipcOff");
    QPixmap iconSub = icons.value(online ? "subOn" : "subOff");

    QTreeWidgetItemIterator it(treeWidget);
    while (*it) {
        QTreeWidgetItem *item = (*it);
        ++it;

        //找到指定地址所在节点
        if (item->data(0, Qt::UserRole).toString() != url) {
            continue;
        }

        //码率节点不用处理
        QString text = item->text(0);
        if (text == "主码流" || text == "子码流") {
            continue;
        }

        //重新设置对应图标/如果还有子节点也就是码流节点则也要设置
        item->setIcon(0, iconIpc);
        for (int i = 0; i < item->childCount(); ++i) {
            item->child(i)->setIcon(0, iconSub);
        }

        break;
    }
}
void DeviceIcon::setTreeIcon(QTreeWidget *treeWidget, const QString &url, bool online)
{
    if (treeWidget->topLevelItemCount() == 0) {
        return;
    }

    //不同的节点显示不同的图标
    QPixmap iconIpc = icons.value(online ? "ipcOn" : "ipcOff");
    QPixmap iconSub = icons.value(online ? "subOn" : "subOff");

    QTreeWidgetItemIterator it(treeWidget);
    while (*it) {
        QTreeWidgetItem *item = (*it);
        ++it;

        //找到指定地址所在节点
        if (item->data(0, Qt::UserRole).toString() != url) {
            continue;
        }

        //码率节点不用处理
        QString text = item->text(0);
        if (text == "主码流" || text == "子码流") {
            continue;
        }

        //重新设置对应图标/如果还有子节点也就是码流节点则也要设置
        item->setIcon(0, iconIpc);
        for (int i = 0; i < item->childCount(); ++i) {
            item->child(i)->setIcon(0, iconSub);
        }

        break;
    }
}
```

## 四、相关地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 文件地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_video_system。
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个