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的控件。在布局管理器(如QVBoxLayout、QHBoxLayout等)中,控件的高度约束会影响布局的最终效果。布局管理器会尝试在最小高度和最大高度之间调整控件大小。
- 如果最小高度大于最大高度,控件可能会显示异常。
- 高度约束的单位是像素,确保传入的值是非负整数。
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、小结
温度报警级别,湿度报警级别,亮度报警级别,具体阈值需根据应用场景(如数据中心、仓库、实验室)调整。
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
