refactor:重构AlarmEvent模块代码结构(建立AlarmEventUtils将所有辅助功能类放入其中)

This commit is contained in:
duanshengchao 2025-11-03 16:49:13 +08:00
parent 78144017d3
commit c99d726b72
6 changed files with 170 additions and 111 deletions

View File

@ -52,6 +52,7 @@ set(H_HEADER_FILES
include/alarmEventMainDialog.h include/alarmEventMainDialog.h
include/alarmEventDataView.h include/alarmEventDataView.h
include/alarmEventRealTimeDock.h include/alarmEventRealTimeDock.h
include/alarmEventUtils.h
) )
set(CPP_SOURCE_FILES set(CPP_SOURCE_FILES
@ -85,6 +86,7 @@ set(CPP_SOURCE_FILES
source/alarmEventMainDialog.cpp source/alarmEventMainDialog.cpp
source/alarmEventDataView.cpp source/alarmEventDataView.cpp
source/alarmEventRealTimeDock.cpp source/alarmEventRealTimeDock.cpp
source/alarmEventUtils.cpp
) )
set(UI_FILES set(UI_FILES

View File

@ -1,42 +1,12 @@
#ifndef ALARMEVENTDATAVIEW_H #ifndef ALARMEVENTDATAVIEW_H
#define ALARMEVENTDATAVIEW_H #define ALARMEVENTDATAVIEW_H
#include "alarmEventGlobal.h" #include "alarmEventUtils.h"
#include <QWidget> #include <QWidget>
#include <QTableView> #include <QTableView>
#include <QAbstractTableModel> #include <QAbstractTableModel>
#include <QStyledItemDelegate> #include <QStyledItemDelegate>
class AlarmEventDataFilter
{
public:
AlarmEventDataFilter();
void setTimeRange(const QDateTime& start, const QDateTime& end) {m_startTime = start; m_endTime = end;}
void setStationFilter(const QString& station) {m_station = station;}
void setBayFilter(const QString& bay) {m_bay = bay;}
void setTypeFilter(int type) {m_type = type;}
void setSeverityFilter(const QString& severity) {m_severity = severity;}
void setDescriptionFilter(const QString& description) {m_description = description;}
void setConfirmStatusFilter(int status) {m_status = status;}
bool matches(const EventData& event);
void clear();
QVector<EventData> apply(const QVector<EventData>& events);
private:
bool isEmpty();
QDateTime m_startTime;
QDateTime m_endTime;
QString m_station;
QString m_bay;
int m_type;
QString m_severity;
QString m_description;
int m_status;
};
class QTimer; class QTimer;
class AlarmEventDataModel : public QAbstractTableModel class AlarmEventDataModel : public QAbstractTableModel
{ {

54
include/alarmEventUtils.h Normal file
View File

@ -0,0 +1,54 @@
#ifndef ALARMEVENTUTILS_H
#define ALARMEVENTUTILS_H
#include "alarmEventGlobal.h"
class AlarmEventDataFilter
{
public:
AlarmEventDataFilter();
void setTimeRange(const QDateTime& start, const QDateTime& end) {m_startTime = start; m_endTime = end;}
void setStationFilter(const QString& station) {m_station = station;}
void setBayFilter(const QString& bay) {m_bay = bay;}
void setTypeFilter(int type) {m_type = type;}
void setSeverityFilter(const QString& severity) {m_severity = severity;}
void setDescriptionFilter(const QString& description) {m_description = description;}
void setConfirmStatusFilter(int status) {m_status = status;}
bool matches(const EventData& event);
void clear();
QVector<EventData> apply(const QVector<EventData>& events);
private:
bool isEmpty();
QDateTime m_startTime;
QDateTime m_endTime;
QString m_station;
QString m_bay;
int m_type;
QString m_severity;
QString m_description;
int m_status;
};
class AlarmEventCache
{
public:
AlarmEventCache();
void setMaxSize(int maxSize);
int getMaxSize() const {return m_maxSize;}
void addEvent(const EventData& event);
void clear();
private:
void trimToSize();
int m_maxSize;
QVector<EventData> m_events;
};
#endif

View File

@ -7,84 +7,6 @@
#include <QMouseEvent> #include <QMouseEvent>
//#include <QApplication> //#include <QApplication>
///////------AlarmEventDataFilter-----
AlarmEventDataFilter::AlarmEventDataFilter()
{
m_type = -1;
m_status = -1;
}
bool AlarmEventDataFilter::matches(const EventData& event)
{
QDateTime eventTime = QDateTime::fromMSecsSinceEpoch(event.timestamp);
if(m_startTime.isValid() && eventTime < m_startTime)
return false;
if(m_endTime.isValid() && eventTime > m_endTime)
return false;
if(!m_station.isEmpty() && event.stationName != m_station)
return false;
if(!m_bay.isEmpty() && event.bayName != m_bay)
return false;
if(event.type != m_type)
return false;
if(!m_severity.isEmpty() && event.severity != m_severity)
return false;
if(!m_description.isEmpty() && event.description != m_description)
return false;
if(event.status != m_status)
return false;
return true;
}
void AlarmEventDataFilter::clear()
{
m_startTime = QDateTime();
m_endTime = QDateTime();
m_station.clear();
m_bay.clear();
m_type = -1;
m_severity.clear();
m_description.clear();
m_status = -1;
}
QVector<EventData> AlarmEventDataFilter::apply(const QVector<EventData>& events)
{
if(isEmpty())
return events;
QVector<EventData> filteredEvents;
filteredEvents.reserve(events.size()); //分配好内存防止后面执行append时造成的多次扩容开销
for(const EventData& event : events)
{
if(matches(event))
filteredEvents.append(event);
}
return filteredEvents; //RVO + QT的隐式共享(QVector),不用担心开销
}
bool AlarmEventDataFilter::isEmpty()
{
return !m_startTime.isValid() &&
!m_endTime.isValid() &&
m_station.isEmpty() &&
m_bay.isEmpty() &&
m_type == -1 &&
m_severity.isEmpty() &&
m_description.isEmpty() &&
m_status == -1;
}
///////------AlarmEventDataModel----- ///////------AlarmEventDataModel-----
AlarmEventDataModel::AlarmEventDataModel(AlarmDataMode mode, QObject* parent) AlarmEventDataModel::AlarmEventDataModel(AlarmDataMode mode, QObject* parent)
: QAbstractTableModel(parent) : QAbstractTableModel(parent)

View File

@ -26,7 +26,7 @@ AlarmEventRealTimeDock::AlarmEventRealTimeDock(QWidget* parent)
connect(m_animationExpand, &QPropertyAnimation::finished, this, [this]{m_isInAnimationExpand = false;}); connect(m_animationExpand, &QPropertyAnimation::finished, this, [this]{m_isInAnimationExpand = false;});
m_animationAlert = new QPropertyAnimation(this, "alertWidgetBGColorAlpha", this); m_animationAlert = new QPropertyAnimation(this, "alertWidgetBGColorAlpha", this);
m_animationAlert->setDuration(3000); m_animationAlert->setDuration(2500);
m_animationAlert->setStartValue(0.0); m_animationAlert->setStartValue(0.0);
m_animationAlert->setEndValue(1.0); m_animationAlert->setEndValue(1.0);
m_animationAlert->setLoopCount(-1);//无限循环 m_animationAlert->setLoopCount(-1);//无限循环
@ -151,7 +151,7 @@ void AlarmEventRealTimeDock::updateAlertWidgetBGColorAlpha()
{ {
// 计算透明度 (从0到200再到0) // 计算透明度 (从0到200再到0)
int alpha = 200 * (1 - qAbs(2 * m_alertWidgetBGColorAlpha - 1)); int alpha = 200 * (1 - qAbs(2 * m_alertWidgetBGColorAlpha - 1));
if(alpha == 1) //1表示不透具体原因为探究,先舍弃该值 if(alpha == 1) //1表示不透具体原因未探究,舍弃该值
return; return;
QString styleSheet = QString( QString styleSheet = QString(
"background-color: qradialgradient(" "background-color: qradialgradient("

111
source/alarmEventUtils.cpp Normal file
View File

@ -0,0 +1,111 @@
#include "alarmEventUtils.h"
///////------AlarmEventDataFilter-----
AlarmEventDataFilter::AlarmEventDataFilter()
{
m_type = -1;
m_status = -1;
}
bool AlarmEventDataFilter::matches(const EventData& event)
{
QDateTime eventTime = QDateTime::fromMSecsSinceEpoch(event.timestamp);
if(m_startTime.isValid() && eventTime < m_startTime)
return false;
if(m_endTime.isValid() && eventTime > m_endTime)
return false;
if(!m_station.isEmpty() && event.stationName != m_station)
return false;
if(!m_bay.isEmpty() && event.bayName != m_bay)
return false;
if(event.type != m_type)
return false;
if(!m_severity.isEmpty() && event.severity != m_severity)
return false;
if(!m_description.isEmpty() && event.description != m_description)
return false;
if(event.status != m_status)
return false;
return true;
}
void AlarmEventDataFilter::clear()
{
m_startTime = QDateTime();
m_endTime = QDateTime();
m_station.clear();
m_bay.clear();
m_type = -1;
m_severity.clear();
m_description.clear();
m_status = -1;
}
QVector<EventData> AlarmEventDataFilter::apply(const QVector<EventData>& events)
{
if(isEmpty())
return events;
QVector<EventData> filteredEvents;
filteredEvents.reserve(events.size()); //分配好内存防止后面执行append时造成的多次扩容开销
for(const EventData& event : events)
{
if(matches(event))
filteredEvents.append(event);
}
return filteredEvents; //RVO + QT的隐式共享(QVector),不用担心开销
}
bool AlarmEventDataFilter::isEmpty()
{
return !m_startTime.isValid() &&
!m_endTime.isValid() &&
m_station.isEmpty() &&
m_bay.isEmpty() &&
m_type == -1 &&
m_severity.isEmpty() &&
m_description.isEmpty() &&
m_status == -1;
}
///////------AlarmEventDataFilter-----
AlarmEventCache::AlarmEventCache()
: m_maxSize(10000)
{}
void AlarmEventCache::trimToSize()
{
if(m_events.size() > m_maxSize)
{
int removeCount = m_events.size() - m_maxSize;
for(int i = 0; i < removeCount; ++i)
m_events.removeFirst();
}
}
void AlarmEventCache::setMaxSize(int maxSize)
{
m_maxSize = maxSize;
trimToSize();
}
void AlarmEventCache::clear()
{
m_events.clear();
}
void AlarmEventCache::addEvent(const EventData& event)
{
m_events.append(event);
trimToSize();
}