码上通QT实战31--系统设置06-保存报警信息

1、前言

温度报警

监控系统的温度报警核心是 "传感器采集 + 阈值判定 + 多级联动",温度报警通过温度传感器(内置 / 外接)实时采集温度,与预设阈值对比,超限时触发报警动作,用于保护设备、环境或物品安全。以下是一些关于温度报警方面的通用设置,关注一下,很专业的哦。

前提准备

  • 硬件前提:摄像机 / NVR 支持内置测温,或外接温度传感器(如 DS18B20、PT100),部分平台需接入测温模块。
  • 软件前提:进入系统 "报警 / 事件配置" 界面,确保设备已正常接入并获取温度数据

设置温度阈值

|---------------|---------|--------|--------------|
| 场景 | 高温阈值 | 低温阈值 | 备注 |
| 设备机房 | 35--38℃ | 5--10℃ | 防止冷凝与过热 |
| 普通监控 | 40--45℃ | 0--5℃ | 适配多数 IPC/NVR |
| 特殊环境(冷库 / 机房) | 按实际需求 | 按实际需求 | 结合行业规范 |

配置报警动作

  • 地动作:蜂鸣器响、报警输出(接声光报警器 / 警灯)、弹窗、标记报警画面
  • 远程动作:手机 App 推送、邮件通知、短信告警、平台联动工单
  • 存储动作:触发异常录像、记录报警日志(含温度值、时间、设备)

设置报警时间段与生效范围

  • 时间段:全天 / 特定时段(如夜间无人值守)
  • 生效范围:指定设备 / 通道,避免无关区域误触发

保存并测试验证

  • 保存配置后,用加热 / 降温手段触发阈值,检查本地与远程动作是否正常
  • 核对报警日志,确保温度数据与触发记录一致

分级报警建议

|--------|------------------------------|-------------------------------------|-----------|
| 级别 | 触发条件 | 联动动作 | 适用场景 |
| 一级(紧急) | 超温≥45℃或低温≤0℃,持续≥5 分钟 | 声光报警 + App 强推 + 邮件 + 录像 + 联动门禁 / 空调 | 设备机房、核心区域 |
| 二级(重要) | 超温 38--44℃或低温 1--4℃,持续≥10 分钟 | 弹窗 + App 推送 + 录像 | 普通监控区域 |
| 三级(提示) | 接近阈值(如 35--37℃) | 日志记录 + 可选 App 通知 | 预防性提醒 |

2、这么干

1、页面设计

2、保存逻辑

QSqlQuery 是 Qt 框架中用于执行 SQL 语句和操作数据库的核心类,支持多种数据库(如 SQLite、MySQL、PostgreSQL 等)。它提供了执行查询、遍历结果集、绑定参数等功能。

基本用法

创建查询对象

通过 QSqlDatabase 连接数据库后,可以直接创建 QSqlQuery 对象:

cpp 复制代码
QSqlQuery query;

执行 SQL 语句

使用 exec() 方法执行 SQL 语句。对于非查询语句(如 INSERT、UPDATE),返回 true 表示成功:

cpp 复制代码
query.exec("CREATE TABLE users (id INT PRIMARY KEY, name TEXT)");

参数化查询

通过占位符(如 :name?)绑定参数,防止 SQL 注入:

cpp 复制代码
query.prepare("INSERT INTO users (id, name) VALUES (:id, :name)");
query.bindValue(":id", 1);
query.bindValue(":name", "Alice");
query.exec();

遍历结果集

对于 SELECT 查询,使用 next() 遍历结果集,并通过 value() 获取字段值:

cpp 复制代码
query.exec("SELECT id, name FROM users");
while (query.next()) {
    int id = query.value(0).toInt();       // 通过索引获取
    QString name = query.value("name").toString(); // 通过字段名获取
}

错误处理

检查 lastError() 获取错误信息:

cpp 复制代码
if (!query.exec("SELECT * FROM invalid_table")) {
    qDebug() << "Error:" << query.lastError().text();
}

批量操作

使用 prepare()addBindValue() 实现批量插入:

cpp 复制代码
query.prepare("INSERT INTO users (id, name) VALUES (?, ?)");
QVariantList ids = {1, 2, 3};
QVariantList names = {"Bob", "Charlie", "Dana"};

query.addBindValue(ids);
query.addBindValue(names);
if (!query.execBatch()) {
    qDebug() << "Batch error:" << query.lastError();
}

性能优化

  • 使用 prepare() 预编译高频查询。
  • 批量操作时优先选择 execBatch()
  • 通过 setForwardOnly(true) 提升只读查询性能

注意事项

  • 确保数据库连接有效后再执行查询。
  • 参数化查询时,占位符语法因数据库驱动而异(如 MySQL 用 ?,PostgreSQL 用 $1)。
  • 多线程环境下需避免跨线程共享 QSqlQuery 对象。

完整代码

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()
{
    // 保存预警信息:温度最高最低,湿度最高最低,亮度最高最低
    QSqlQuery sqlQuery;
    //温度最高
    sqlQuery.prepare("UPDATE conditions SET status=?,compare_value=?, alarm_msg=? WHERE c_num=?");
    sqlQuery.addBindValue(ui->cb_temp1->isChecked()?"1":"0");
    sqlQuery.addBindValue(ui->le_tempvalue1->text());
    sqlQuery.addBindValue(ui->le_tempmesg1->text());
    sqlQuery.addBindValue("C001");
    if(!sqlQuery.exec())
    {
        qDebug() << sqlQuery.lastError();
    }
    //温度最低
    sqlQuery.prepare("UPDATE conditions SET status=?,compare_value=?, alarm_msg=? WHERE c_num=?");
    sqlQuery.addBindValue(ui->cb_temp2->isChecked()?"1":"0");
    sqlQuery.addBindValue(ui->le_tempvalue2->text());
    sqlQuery.addBindValue(ui->le_tempmesg2->text());
    sqlQuery.addBindValue("C002");
    if(!sqlQuery.exec())
    {
        qDebug() << sqlQuery.lastError();
    }
    //湿度最高
    sqlQuery.prepare("UPDATE conditions SET status=?,compare_value=?, alarm_msg=? WHERE c_num=?");
    sqlQuery.addBindValue(ui->cb_humi1->isChecked()?"1":"0");
    sqlQuery.addBindValue(ui->le_humivalue1->text());
    sqlQuery.addBindValue(ui->le_humimesg1->text());
    sqlQuery.addBindValue("C003");
    if(!sqlQuery.exec())
    {
        qDebug() << sqlQuery.lastError();
    }
    //湿度最低
    sqlQuery.prepare("UPDATE conditions SET status=?,compare_value=?, alarm_msg=? WHERE c_num=?");
    sqlQuery.addBindValue(ui->cb_humi2->isChecked()?"1":"0");
    sqlQuery.addBindValue(ui->le_humivalue2->text());
    sqlQuery.addBindValue(ui->le_humimesg2->text());
    sqlQuery.addBindValue("C004");
    if(!sqlQuery.exec())
    {
        qDebug() << sqlQuery.lastError();
    }
    //亮度最高
    sqlQuery.prepare("UPDATE conditions SET status=?,compare_value=?, alarm_msg=? WHERE c_num=?");
    sqlQuery.addBindValue(ui->cb_bright1->isChecked()?"1":"0");
    sqlQuery.addBindValue(ui->le_brightvalue1->text());
    sqlQuery.addBindValue(ui->le_brightmesg1->text());
    sqlQuery.addBindValue("C005");
    if(!sqlQuery.exec())
    {
        qDebug() << sqlQuery.lastError();
    }
    //亮度最低
    sqlQuery.prepare("UPDATE conditions SET status=?,compare_value=?, alarm_msg=? WHERE c_num=?");
    sqlQuery.addBindValue(ui->cb_bright2->isChecked()?"1":"0");
    sqlQuery.addBindValue(ui->le_brightvalue2->text());
    sqlQuery.addBindValue(ui->le_brightmesg2->text());
    sqlQuery.addBindValue("C006");
    if(!sqlQuery.exec())
    {
        qDebug() << sqlQuery.lastError();
    }

    QMessageBox::information(this, "提示", "保存完成", QMessageBox::NoButton, QMessageBox::Close);
}

3、运行测试

4、小结

监控系统的温度报警核心是 "传感器采集 + 阈值判定 + 多级联动",温度报警通过温度传感器(内置 / 外接)实时采集温度,与预设阈值对比,超限时触发报警动作,用于保护设备、环境或物品安全。

复制代码
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
相关推荐
林鸿风采2 小时前
在Alpine Linux上部署docker和Portainer管理工具
linux·运维·docker·portainer
@22063 小时前
银河麒麟系统离线环境下用docke方式部署(Postgres、Nginx、Redis、JDK)
运维·数据库·redis·nginx
小蜗的房子4 小时前
Oracle 19C RAC Public IP单网卡改为bond模式操作指南
运维·网络·数据库·sql·tcp/ip·oracle·oracle rac
sun0077004 小时前
androd和qnx判断实网卡还是虚网卡
运维·服务器·网络
口嗨农民工4 小时前
live555 sample基本解读
运维·服务器
海盗12345 小时前
VMware 中 CentOS 7 无法使用 yum 安装 wget 的完整解决方案
linux·运维·centos
kida_yuan5 小时前
【Linux】在树莓派上搭建自建 Git 服务(基于 GitLab)- 实战笔记与运维清单
运维·gitlab·树莓派
lph0095 小时前
mqtt broker (mosquitto)创建服务器、订阅与发布
运维·服务器