码上通QT实战30--系统设置05-加载报警信息

1、前言

在Qt项目中实现报警信息监控通常涉及信号与槽机制、日志记录、界面展示等模块,以下是一些关键要点方法:

信号与槽触发报警 通过自定义信号与槽实现报警事件的传递。例如定义报警信号:

多级报警分类 建议采用枚举定义报警级别:

报警信息存储 使用SQLite数据库持久化存储报警记录:

报警信息可视化表格视图展示可 通过QTableView显示历史报警记录,实时报警提示可 使用状态栏或浮动窗口显示实时报警:时间范围过滤可实现按时间筛选报警记录:

性能优化建议

  • 采用异步方式处理报警事件避免阻塞主线程
  • 对高频报警实现防抖机制(如500ms内相同报警只记录一次)
  • 定期归档历史报警数据保持数据库性能
  • 为严重报警实现自动升级通知机制(如未确认报警重复通知)

报警信息的级别分类

报警信息通常根据严重性、紧急程度和影响范围划分为不同级别,不同行业或系统可能采用不同的分类标准,工业与民用环境中,报警级别也采用不同的标准,具体阈值需根据应用场景(如数据中心、仓库、实验室)调整。报警级别可能结合其他参数(如持续时间)综合判定。工业标准(如ISO或IEEE)可能提供更详细的分类依据。比如:

温度报警级别

  • 正常范围:18°C~28°C(室内环境参考值)。
  • 一级预警:超出正常范围但未达危险值(如28°C~35°C或10°C~18°C)。
  • 二级报警:高温35°C~45°C或低温0°C~10°C,可能引发设备故障或健康风险。
  • 三级紧急报警:极端高温(>45°C)或极端低温(<0°C),可能导致设备损坏或人身伤害。

湿度报警级别

  • 正常范围:40%~60% RH(舒适区,适用于多数场景)。
  • 一级预警:60%~70% RH(可能滋生霉菌)或30%~40% RH(干燥不适)。
  • 二级报警:70%~85% RH(高湿腐蚀风险)或15%~30% RH(静电危害)。
  • 三级紧急报警:>85% RH(设备短路风险)或<15% RH(极端干燥,火灾隐患)。

亮度报警级别

  • 正常范围:100~1000 lux(室内工作照明标准)。
  • 一级预警:<50 lux(光线不足)或>2000 lux(强光眩目)。
  • 二级报警:<10 lux(黑暗环境风险)或>5000 lux(可能损伤视觉设备)。
  • 三级紧急报警:<1 lux(完全黑暗)或>10000 lux(极端强光危害)。

2、一起干

1、整体设计

温度报警:最高,最低

湿度报警:最高,最低

亮度报警:最高,最低

2、报警参数

QGridLayout 是 Qt 中用于管理控件网格状排列的布局管理器,支持多行多列的灵活布局。

注意事项

  • 行列索引从 0 开始。
  • 未显式设置拉伸比例时,行列默认均分空间。
  • 通过 setSpacing() 可统一设置行列间距。

垂直布局(Vertical Layout)在Qt中通过QVBoxLayout类实现,用于将控件按垂直方向依次排列。所有子控件默认从上到下分布,并可根据设置调整间距和对齐方式。

3、命令按钮

在Qt布局中,可以通过setMinimumHeight()setMaximumHeight()方法分别设置控件的最小高度和最大高度。这些方法属于QWidget类,因此适用于所有继承自QWidget的控件。在布局管理器(如QVBoxLayoutQHBoxLayout等)中,控件的高度约束会影响布局的最终效果。布局管理器会尝试在最小高度和最大高度之间调整控件大小。

  • 如果最小高度大于最大高度,控件可能会显示异常。
  • 高度约束的单位是像素,确保传入的值是非负整数。

4、QSS样式

cpp 复制代码
/*设置QTabWidget样式*/
QTabWidget{
	background:transparent;
}
QTabWidget::pane{
	border:none;
}
QTabWidget::tab-bar{
	alignment:right;
}

/*设置QTabBar样式*/
QTabBar::tab{
	font:15px;
	width:100px;					/*设置宽度*/
	height:26; 					/*设置高度*/
	margin-top:5px; 			/*设置边距*/
	margin-right:0px;
	margin-left:0px;
	margin-bottom:0px;
}
/*设置圆角*/
QTabBar::tab:first{
	border-top-left-radius:13px;
	border-bottom-left-radius:13px;
}

QTabBar::tab:last{
	border-top-right-radius:13px;
	border-bottom-right-radius:13px;
}

/*设置选中的颜色*/
QTabBar::tab:first:selected,
QTabBar::tab:last:selected{
	color:#FFFFFF;
	background:#409EFE;
}
/*设置未选的颜色*/
QTabBar::tab:first:!selected,
QTabBar::tab:last:!selected{
	color:#333333;
	background:#11000000;
}



/*底部按钮样式*/
QPushButton{
	border:none;
   font-size:13px;
	border-radius:3px;
	background:#409EFE;
	width:80px;
	height:26px;
	color:white;
}
QPushButton:hover{
	background:#307AEA;
}

/*中间表格样式*/
QTableWidget{
	border:none;
	border-radius:5px;
	background-color:transparent;
}
QTableWidget::item:selected{
	background-color:"#22409EFE";
	color:#555555;
}
/*表头*/
QHeaderView::section{
	text-align:center;
	background:#FFFFFF;
	padding:3px;
	margin:0px;
	color:#555555;
	border:none;
	border-left-width:0;
	height:20px;
}



QLabel#lbl_error{
	color:red;
}

#label,#label_4,#label_7,#label_10,#label_13,#label_16,#label_17{
	margin:0px 25px 0px 0px;
	
}
#label_2,#label_3,
#label_5,#label_6,
#label_8,#label_9,
#label_11,#label_12,
#label_14,#label_15,
#label_17,#label_18{
	color:#66000000;
}


QCheckBox{
	margin:0px 25px 0px 0px;
}

QSS(Qt样式表)提供了丰富的属性用于定制Qt控件的外观

5、数据表设计

6、修改代码

cpp 复制代码
#include "settingsview.h"
#include "ui_settingsview.h"
#include <EditUserDialog.h>
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>

SettingsView::SettingsView(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::SettingsView)
{
    ui->setupUi(this);
    //设置"描述"这一列内容的模式为自动平铺,即第11列
    ui->tw_users->horizontalHeader()->setSectionResizeMode(11,QHeaderView::Stretch);
    //数据初始化
    DB=QSqlDatabase::addDatabase("QSQLITE");
    DB.setDatabaseName(QApplication::applicationDirPath()+"/data.db3");
    if(!DB.open()){
        //ui->lbl_error->setText("数据库对象初始化失败");
    }

    this->refresh();
}

SettingsView::~SettingsView()
{
    delete ui;
}

//刷新
void SettingsView::refresh()
{
    if(!DB.isOpen()&&!DB.open()){
        return;
    }

    //1、获取用户信息,并将信息赋给页面控件
    QSqlQuery query_user("select * from users");
    int row=0;
    //遍历查询结果,将每一行数据赋给表格控件
    while(query_user.next()){
        ui->tw_users->setRowCount(row+1);//产生一个新行
        //编号id
        QString rid = query_user.value(0).toString();
        QTableWidgetItem *item = new QTableWidgetItem(rid);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 0, item);//给当前行设置对象
        //用户id
        QString uid = query_user.value(1).toString();
        QTableWidgetItem *item2 = new QTableWidgetItem(uid);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 1, item2);//给当前行设置对象
        //用户名称
        QString name = query_user.value(2).toString();
        item = new QTableWidgetItem(name);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 2, item);
        //用户名
        QString real = query_user.value(3).toString();
        item = new QTableWidgetItem(real);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 3, item);
        //密码
        QString pwd = query_user.value(4).toString();
        item = new QTableWidgetItem(pwd);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 4, item);
        //班组
        QString group = query_user.value(5).toString();
        item = new QTableWidgetItem(group);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 5, item);
        //职务
        QString post = query_user.value(6).toString();
        item = new QTableWidgetItem(post);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 6, item);
        //部门
        QString dept = query_user.value(7).toString();
        item = new QTableWidgetItem(dept);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 7, item);
        //用户性别
        QString gender = query_user.value(8).toString();
        gender=gender=="1"?"男":"女";
        item = new QTableWidgetItem(gender);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 8, item);
        //年龄
        QString age = query_user.value(9).toString();
        item = new QTableWidgetItem(age);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 9, item);
        //手机
        QString phone = query_user.value(10).toString();
        item = new QTableWidgetItem(phone);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 10, item);
        //描述
        QString desc = query_user.value(11).toString();
        item = new QTableWidgetItem(desc);
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        ui->tw_users->setItem(row, 11, item);

        ++row;
    }

    //2、获取报警信息,并将信息赋给页面控件
    QSqlQuery query_alarm("select c_num,c_header,c_operator,compare_value,alarm_msg,status from conditions");
    //温度最高预警
    if(query_alarm.next()){
        QString value = query_alarm.value(3).toString();
        ui->le_tempvalue1->setText(value);

        QString msg = query_alarm.value(4).toString();
        ui->le_tempmesg1->setText(msg);

        QString status = query_alarm.value(5).toString();
        ui->cb_temp1->setChecked(status=="1");
    }
    //温度最低预警
    if(query_alarm.next()){
        QString value = query_alarm.value(3).toString();
        ui->le_tempvalue2->setText(value);

        QString msg = query_alarm.value(4).toString();
        ui->le_tempmesg2->setText(msg);

        QString status = query_alarm.value(5).toString();
        ui->cb_temp2->setChecked(status=="1");
    }
    //湿度最高预警
    if(query_alarm.next()){
        QString value = query_alarm.value(3).toString();
        ui->le_humivalue1->setText(value);

        QString msg = query_alarm.value(4).toString();
        ui->le_humimesg1->setText(msg);

        QString status = query_alarm.value(5).toString();
        ui->cb_humi1->setChecked(status=="1");
    }
    //湿度最低预警
    if(query_alarm.next()){
        QString value = query_alarm.value(3).toString();
        ui->le_humivalue2->setText(value);

        QString msg = query_alarm.value(4).toString();
        ui->le_humimesg2->setText(msg);

        QString status = query_alarm.value(5).toString();
        ui->cb_humi2->setChecked(status=="1");
    }
    //亮度最高预警
    if(query_alarm.next()){
        QString value = query_alarm.value(3).toString();
        ui->le_brightvalue1->setText(value);

        QString msg = query_alarm.value(4).toString();
        ui->le_brightmesg1->setText(msg);

        QString status = query_alarm.value(5).toString();
        ui->cb_bright1->setChecked(status=="1");
    }
    //亮度最低预警
    if(query_alarm.next()){
        QString value = query_alarm.value(3).toString();
        ui->le_brightvalue2->setText(value);

        QString msg = query_alarm.value(4).toString();
        ui->le_brightmesg2->setText(msg);

        QString status = query_alarm.value(5).toString();
        ui->cb_bright2->setChecked(status=="1");
    }

}

//刷新
void SettingsView::on_pb_refresh_clicked()
{
    this->refresh();
}

//新增
void SettingsView::on_pb_new_clicked()
{
    EditUserDialog *edu=new EditUserDialog();
    edu->setDatabase(this->DB);//设置数据库
    edu->exec();
    this->refresh();
}

//编辑
void SettingsView::on_pb_edit_clicked()
{
    // 拿到当前行数据
    if(ui->tw_users->currentRow()<0){
        QMessageBox::warning(this,"提示","请选择一行数据",QMessageBox::NoButton,QMessageBox::Close);
        return;
    }

    //获取当前选择行的每列数据
    QString uid= ui->tw_users->item(ui->tw_users->currentRow(),1)->text();
    QString un= ui->tw_users->item(ui->tw_users->currentRow(),2)->text();
    QString rn= ui->tw_users->item(ui->tw_users->currentRow(),3)->text();
    QString pwd= ui->tw_users->item(ui->tw_users->currentRow(),4)->text();
    QString group= ui->tw_users->item(ui->tw_users->currentRow(),5)->text();
    QString posi= ui->tw_users->item(ui->tw_users->currentRow(),6)->text();
    QString dept= ui->tw_users->item(ui->tw_users->currentRow(),7)->text();
    QString gender= ui->tw_users->item(ui->tw_users->currentRow(),8)->text();
    QString age= ui->tw_users->item(ui->tw_users->currentRow(),9)->text();
    QString phone= ui->tw_users->item(ui->tw_users->currentRow(),10)->text();
    QString desc= ui->tw_users->item(ui->tw_users->currentRow(),11)->text();

    EditUserDialog *eud=new EditUserDialog();
    eud->setDatabase(this->DB);
    //将用户信息传递给页面
    eud->setUserInfo(uid,un,rn,pwd,group,posi,dept,gender,age,phone,desc);
    eud->exec();

    this->refresh();
}

//删除
void SettingsView::on_pb_del_clicked()
{
    if(ui->tw_users->currentRow()<0) {
        QMessageBox::warning(this,"提示","请选择一行数据",QMessageBox::NoButton,QMessageBox::Close);
        return;
    }
    // 弹出删除确认提示框
    QMessageBox::StandardButton result = QMessageBox::question(
        this,                          // 父窗口(确保对话框居中显示)
        "确认删除",                    // 对话框标题
        "你确定要删除这条数据吗?删除后无法恢复!",  // 提示内容
        QMessageBox::Yes | QMessageBox::No,  // 显示的按钮
        QMessageBox::No                // 默认选中的按钮(防止回车误触)
        );

    // 根据用户选择执行对应操作
    if (result == QMessageBox::Yes) {//执行删除
        QString uid= ui->tw_users->item(ui->tw_users->currentRow(),1)->text();//获取用户id
        QSqlQuery sqlQuery(DB);
        sqlQuery.exec(QString("DELETE FROM users WHERE user_id = %1").arg(uid));//删除语句

        if(!sqlQuery.exec()){
            QMessageBox::warning(this,"提示","删除失败",QMessageBox::NoButton,QMessageBox::Close);
            return;
        }else{
            QMessageBox::information(this,"提示","删除成功",QMessageBox::NoButton,QMessageBox::Close);
        }
        this->refresh();
    } else {//返回
        return;
    }
}

//保存报警设置
void SettingsView::on_pb_save_clicked()
{

}

7、运行效果

8、小结

温度报警级别,湿度报警级别,亮度报警级别,具体阈值需根据应用场景(如数据中心、仓库、实验室)调整。

复制代码
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
相关推荐
dblens 数据库管理和开发工具2 小时前
QueryNote 云端笔记,正式上线
数据库·笔记·querynote·q笔记
@zulnger2 小时前
Django 框架
数据库·django·sqlite
星火开发设计2 小时前
深入浅出HDFS:分布式文件系统核心原理与实践解析
大数据·数据库·hadoop·学习·hdfs·分布式数据库·知识
Java后端的Ai之路2 小时前
【Python教程02】-列表和元组
服务器·数据库·python·列表·元组
知识分享小能手2 小时前
Oracle 19c入门学习教程,从入门到精通,Oracle体系结构 —— 知识点详解(2)
数据库·学习·oracle
心怀梦想2 小时前
mysql下的日志文件
数据库·mysql
deng-c-f2 小时前
Linux C/C++ 学习日记(62):Redis(三):订阅
数据库·redis·学习
论迹2 小时前
【RabbitMQ】-- 高级特性
数据库·redis·分布式·消息队列·rabbitmq
DarkAthena2 小时前
【GaussDB】解析GaussDB热补丁机制
数据库·gaussdb