#ifndef ALARMEVENTDATAVIEW_H #define ALARMEVENTDATAVIEW_H #include "alarmEventGlobal.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(); 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 QTimer; class AlarmEventDataModel : public QAbstractTableModel { Q_OBJECT public: enum Column { Index, ReceiveTime, SOETime, Station, Bay, Description, Type, Severity, Status, Operation, }; struct RowData { QVector values; }; struct PaginationInfo { int totalEntries; int entriesPerPage; int totalPages; int currentPage; }; struct SectionData { int width = -1; Column column; QString text; SectionData(QString t, int w, Column c) :text(t) ,column(c) ,width(w){} }; explicit AlarmEventDataModel(QObject* parent = nullptr); ~AlarmEventDataModel(); //QAbstractTableModel接口实现 QModelIndex index(int row, int column, const QModelIndex& parent) const override; QVariant data(const QModelIndex& index, int role) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; //bool setData(const QModelIndex& index, const QVariant &value, int role = Qt::EditRole) override; int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; Qt::ItemFlags flags(const QModelIndex& index) const override; //自定义功能函数 const QVector headerData() const {return m_headerData;} void setMode(AlarmDataMode mode) {m_dataMode = mode;} 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 onTimeoutSimulateData(); 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_allEvents; //所有事件 QVector m_headerData; PaginationInfo m_paginationInfo; QTimer* m_simulatedDataTimer; AlarmDataMode m_dataMode; AlarmEventDataFilter m_currentFilter; int m_maxRealTimeEvents; }; class AlarmEventDataDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit AlarmEventDataDelegate(QTableView* view, QObject* parent = nullptr); ~AlarmEventDataDelegate(); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; private: QTableView* m_tableView; }; class QVBoxLayout; class AlarmEventDataView : public QWidget { Q_OBJECT public: AlarmEventDataView(QWidget* parent = nullptr); ~AlarmEventDataView(); void setModelMode(AlarmDataMode, int maxRealTimeEvents = 5); private: QTableView* m_tableView; AlarmEventDataModel* m_tableModel; AlarmEventDataDelegate* m_delegate; QVBoxLayout* m_vLayout; }; #endif