diff --git a/include/alarmEventDataView.h b/include/alarmEventDataView.h index f98035c..effdaae 100644 --- a/include/alarmEventDataView.h +++ b/include/alarmEventDataView.h @@ -7,6 +7,33 @@ #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(); + +private: + 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 AlarmEventDataModel : public QAbstractTableModel { Q_OBJECT @@ -34,7 +61,7 @@ public: struct PaginationInfo { int totalEntries; - int entriesPerpage; + int entriesPerPage; int totalPages; int currentPage; }; @@ -67,46 +94,30 @@ public: const QVector headerData() const {return m_headerData;} void setMaxRealTimeEvents(int value) {m_maxRealTimeEvents = value;} const int getMaxRealTimeEvents() const {return m_maxRealTimeEvents;} + void setFilter(const AlarmEventDataFilter& filter); + void applyFilter(); + void refresh(); + +private: + void onRealTimeEventReceived(const EventData& event); private: void iniHeaderData(); void updateCurPageData(); //更新当前页的数据 void updateTotalCount(); //更新总记录数 + int findEventDataIndexById(const QString& eventId); + void updateEventData(int index, const EventData& updatedEvent); - QVector m_displayEvents; + QVector m_displayEvents; //当前(页)展示的事件 + QVector m_allEvents; //所有事件 QVector m_headerData; PaginationInfo m_paginationInfo; + AlarmDataMode m_dataMode; + AlarmEventDataFilter m_currentFilter; int m_maxRealTimeEvents; }; -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(); - -private: - 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 AlarmEventDataDelegate : public QStyledItemDelegate { Q_OBJECT diff --git a/include/alarmEventRealTimeDock.h b/include/alarmEventRealTimeDock.h index 44faf63..966f1f4 100644 --- a/include/alarmEventRealTimeDock.h +++ b/include/alarmEventRealTimeDock.h @@ -9,6 +9,7 @@ class alarmEventRealTimeDock; } QT_END_NAMESPACE +class AlarmEventDataView; class QPropertyAnimation; class AlarmEventRealTimeDock : public QWidget { @@ -31,6 +32,7 @@ private: void collapse(); Ui::alarmEventRealTimeDock* ui; + AlarmEventDataView* m_tableView; QPropertyAnimation* m_animation; bool m_isInAnimation; QString m_curState; diff --git a/source/alarmEventDataView.cpp b/source/alarmEventDataView.cpp index 07db7a5..29b21cf 100644 --- a/source/alarmEventDataView.cpp +++ b/source/alarmEventDataView.cpp @@ -3,10 +3,64 @@ #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; +} + + ///////------AlarmEventDataModel----- AlarmEventDataModel::AlarmEventDataModel(QObject* parent) : QAbstractTableModel(parent) + ,m_maxRealTimeEvents(5) { + m_dataMode = Historical; + m_paginationInfo.entriesPerPage = 100; + m_paginationInfo.currentPage = 1; + m_paginationInfo.totalEntries = 0; iniHeaderData(); } @@ -31,7 +85,7 @@ QVariant AlarmEventDataModel::data(const QModelIndex& index, int role) const int row = index.row(); int col = index.column(); - int globalRow = (m_paginationInfo.currentPage - 1) * m_paginationInfo.entriesPerpage + row; + int globalRow = (m_paginationInfo.currentPage - 1) * m_paginationInfo.entriesPerPage + row; const EventData& event = m_displayEvents.at(row); //EventData event = m_displayEvents[row]; @@ -132,6 +186,17 @@ void AlarmEventDataModel::iniHeaderData() m_headerData.emplace_back(SectionData("操作", 300, Operation)); } +void AlarmEventDataModel::setFilter(const AlarmEventDataFilter& filter) +{ + m_currentFilter = filter; +} + +void AlarmEventDataModel::applyFilter() +{} + +void AlarmEventDataModel::refresh() +{} + void AlarmEventDataModel::updateCurPageData() { beginResetModel(); @@ -144,55 +209,63 @@ void AlarmEventDataModel::updateCurPageData() void AlarmEventDataModel::updateTotalCount() {} - -///////------AlarmEventDataFilter----- -AlarmEventDataFilter::AlarmEventDataFilter() +int AlarmEventDataModel::findEventDataIndexById(const QString& eventId) { - m_type = -1; - m_status = -1; + for(int i = 0; i < m_displayEvents.size(); i++) + { + if(m_displayEvents.at(i).id == eventId) + return i; + } + + return -1; } -bool AlarmEventDataFilter::matches(const EventData& event) +void AlarmEventDataModel::updateEventData(int index, const EventData& updatedEvent) { - 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(index < 0 || index >= m_displayEvents.size()) + return; - 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; + m_displayEvents[index] = updatedEvent; + //更新视图 + QModelIndex modelIndex = createIndex(index, 0); + emit dataChanged(modelIndex, modelIndex); } -void AlarmEventDataFilter::clear() +void AlarmEventDataModel::onRealTimeEventReceived(const EventData& event) { - m_startTime = QDateTime(); - m_endTime = QDateTime(); - m_station.clear(); - m_bay.clear(); - m_type = -1; - m_severity.clear(); - m_description.clear(); - m_status = -1; + if(m_dataMode != RealTime) + return; + + int index = findEventDataIndexById(event.id); + if(index >= 0) + { + updateEventData(index, event); + return; + } + + beginResetModel(); + + //插入数据之前,先判断当前是否达到最大显示条目,达到的话删除最靠前(时间)的条目 + if(m_displayEvents.size() >= m_maxRealTimeEvents) + m_displayEvents.removeLast(); + + //按照时间顺序排序(从小到大) + int insertPosition = 0; + for(; insertPosition < m_displayEvents.size(); ++insertPosition) + { + if(event.timestamp > m_displayEvents.at(insertPosition).timestamp) + break; + } + + if(insertPosition < m_displayEvents.size()) + m_displayEvents.insert(insertPosition, event); + else + m_displayEvents.append(event); + + endResetModel(); } + ///////------AlarmEventDataDelegate----- AlarmEventDataDelegate::AlarmEventDataDelegate(QTableView* view, QObject* parent) : QStyledItemDelegate(parent) diff --git a/source/alarmEventRealTimeDock.cpp b/source/alarmEventRealTimeDock.cpp index 70990d6..c6c8e02 100644 --- a/source/alarmEventRealTimeDock.cpp +++ b/source/alarmEventRealTimeDock.cpp @@ -1,5 +1,6 @@ #include "alarmEventRealTimeDock.h" #include "./ui_alarmEventRealTimeDock.h" +#include "alarmEventDataView.h" #include #include @@ -15,6 +16,9 @@ AlarmEventRealTimeDock::AlarmEventRealTimeDock(QWidget* parent) m_isInAnimation = false; m_curState = "collapse"; + m_tableView = new AlarmEventDataView(this); + ui->tableLayout->addWidget(m_tableView); + m_animation = new QPropertyAnimation(this, "geometry"); m_animation->setDuration(120); connect(m_animation, &QPropertyAnimation::finished, this, [this]{m_isInAnimation = false;}); diff --git a/ui/alarmEventMainDialog.ui b/ui/alarmEventMainDialog.ui index 9e74403..c8dc018 100644 --- a/ui/alarmEventMainDialog.ui +++ b/ui/alarmEventMainDialog.ui @@ -6,8 +6,8 @@ 0 0 - 1539 - 992 + 1563 + 904 @@ -177,7 +177,7 @@ font: 700 18pt "微软雅黑"; - 历史事件 + 全部事件 @@ -526,7 +526,7 @@ icon: url(:/images/icon_configuration.png); - + 0 diff --git a/ui/alarmEventRealTimeDock.ui b/ui/alarmEventRealTimeDock.ui index 9e2f643..0577ca4 100644 --- a/ui/alarmEventRealTimeDock.ui +++ b/ui/alarmEventRealTimeDock.ui @@ -563,111 +563,24 @@ QTableView::item:selected 0 - - - Qt::TextElideMode::ElideNone - - - false - - - false - - - - 新建行 + + + + 0 - - - - 新建行 + + 0 - - - - 新建行 + + 0 - - - - 新建行 + + 0 - - - - 新建行 + + 0 - - - - 序号 - - - - - 时间 - - - - - 厂站 - - - - - 详情 - - - - - 类型 - - - - - 级别 - - - - - 操作 - - - - - 1 - - - - - 2025-09-17 16:51:01 - - - - - 灵州换流站 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - +