diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cfe53b..2f5cc63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ set(H_HEADER_FILES include/alarmEventMainDialog.h include/alarmEventDataView.h include/alarmEventRealTimeDock.h + include/alarmEventUtils.h ) set(CPP_SOURCE_FILES @@ -85,6 +86,7 @@ set(CPP_SOURCE_FILES source/alarmEventMainDialog.cpp source/alarmEventDataView.cpp source/alarmEventRealTimeDock.cpp + source/alarmEventUtils.cpp ) set(UI_FILES diff --git a/include/alarmEventDataView.h b/include/alarmEventDataView.h index c15f201..7b4eca0 100644 --- a/include/alarmEventDataView.h +++ b/include/alarmEventDataView.h @@ -1,42 +1,12 @@ #ifndef ALARMEVENTDATAVIEW_H #define ALARMEVENTDATAVIEW_H -#include "alarmEventGlobal.h" +#include "alarmEventUtils.h" #include #include #include #include -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 apply(const QVector& 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 AlarmEventDataModel : public QAbstractTableModel { diff --git a/include/alarmEventUtils.h b/include/alarmEventUtils.h new file mode 100644 index 0000000..5025886 --- /dev/null +++ b/include/alarmEventUtils.h @@ -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 apply(const QVector& 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 m_events; +}; + +#endif diff --git a/source/alarmEventDataView.cpp b/source/alarmEventDataView.cpp index 37a4269..6497e4c 100644 --- a/source/alarmEventDataView.cpp +++ b/source/alarmEventDataView.cpp @@ -7,84 +7,6 @@ #include //#include -///////------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 AlarmEventDataFilter::apply(const QVector& events) -{ - if(isEmpty()) - return events; - - QVector 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(AlarmDataMode mode, QObject* parent) : QAbstractTableModel(parent) diff --git a/source/alarmEventRealTimeDock.cpp b/source/alarmEventRealTimeDock.cpp index 7280a5f..8385abe 100644 --- a/source/alarmEventRealTimeDock.cpp +++ b/source/alarmEventRealTimeDock.cpp @@ -26,7 +26,7 @@ AlarmEventRealTimeDock::AlarmEventRealTimeDock(QWidget* parent) connect(m_animationExpand, &QPropertyAnimation::finished, this, [this]{m_isInAnimationExpand = false;}); m_animationAlert = new QPropertyAnimation(this, "alertWidgetBGColorAlpha", this); - m_animationAlert->setDuration(3000); + m_animationAlert->setDuration(2500); m_animationAlert->setStartValue(0.0); m_animationAlert->setEndValue(1.0); m_animationAlert->setLoopCount(-1);//无限循环 @@ -151,7 +151,7 @@ void AlarmEventRealTimeDock::updateAlertWidgetBGColorAlpha() { // 计算透明度 (从0到200再到0) int alpha = 200 * (1 - qAbs(2 * m_alertWidgetBGColorAlpha - 1)); - if(alpha == 1) //1表示不透,具体原因为探究,先舍弃该值 + if(alpha == 1) //1表示不透,具体原因未探究,舍弃该值 return; QString styleSheet = QString( "background-color: qradialgradient(" diff --git a/source/alarmEventUtils.cpp b/source/alarmEventUtils.cpp new file mode 100644 index 0000000..8eeb541 --- /dev/null +++ b/source/alarmEventUtils.cpp @@ -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 AlarmEventDataFilter::apply(const QVector& events) +{ + if(isEmpty()) + return events; + + QVector 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(); +}