首页| 论坛| 消息
主题:Qt监控设备离线检测/实时监测设备上下线/显示不同的状态图标/海康大华宇视华为监控系统
liudianwu发表于 2025-02-09 10:07
## 一、前言说明
监控系统中一般有很多设备,有些用户希望知道每个设备是否已经上线,最好有不同的状态图标提示,海康的做法是对设备节点的图标和颜色变暗处理,离线的话就变暗,有可能是加了透明度,而大华的处理是有个清晰的图标表示,上线图标右下角有个绿色指示灯,离线的右下角是个圆形的叉叉,如果右侧监控视频通道已经打开过,则又是一个带打开了的图标,非常直观,文字颜色可以不用去变,三种图标切换,这是目前为止看到的最完美的处理方案,于是也按照这个方案来实施。
之前做设备多级分组的时候,就已经把各种设备树对应的功能单独拆分完整,每个函数都单独干自己的事情,比如第一步就是根据分组配置信息生成分组的treewidget结构。第二步就是逐个遍历所有分组节点,查找摄像机表中是否有该分组的子设备,有的话则插入子节点。第三步是遍历所有节点设置图标,分组是分组的图标,摄像头是摄像头的图标,后面还可以自行区分是枪机还是球机或者其他类型的设备。第四步是读取配置文件展开最后展开的节点。总共四步才算完成,每个函数干干净净只干自己的事情,之前全部在一个函数中实现,不易于管理和拓展,比如需要区分不同的图标。
## 二、效果图

## 三、相关代码
```cpp
#include "deviceicon.h"
#include "devicetree.h"
#include "qthelper.h"
#include "iconhelper.h"
QMap DeviceIcon::icons = QMap();
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 == "主码

浏览大图
下一页 (1/3)
回帖(0):

全部回帖(0)»
最新回帖
收藏本帖
发新帖