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、小结
监控系统的温度报警核心是 "传感器采集 + 阈值判定 + 多级联动",温度报警通过温度传感器(内置 / 外接)实时采集温度,与预设阈值对比,超限时触发报警动作,用于保护设备、环境或物品安全。
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
