#ifndef PLANCARD_H #define PLANCARD_H #include #include #include #include "TransmitterSwitchInfo.h" namespace Ui { class PlanCard; } /** * @brief 用户枚举值 * */ enum QtUserRole { UserRole_WeekDay = Qt::UserRole + 1, /* 周几 */ UserRole_Time, /* 时间 */ UserRole_OnOff /* 开关机 */ }; /** * @brief 计划信息结构体 * */ struct PlanInfo { enum_WeekDay onWeekDay; /* 周几 */ QDateTime onDateTime; /* 时间 */ enum_WeekDay offWeekDay; /* 周几 */ QDateTime offDateTime; /* 时间 */ PlanInfo(); PlanInfo(const PlanInfo& info); PlanInfo& operator=(const PlanInfo& info); bool operator==(const PlanInfo& info) const; }; /** * @brief 自定义排序类 * */ class CSortModel : public QSortFilterProxyModel { Q_OBJECT public: explicit CSortModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {} ~CSortModel() {} protected: /* 重载比较函数 */ bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; }; class PlanCard : public QWidget { Q_OBJECT public: explicit PlanCard(QWidget *parent = nullptr); ~PlanCard(); /* 设置频率信息 */ void setChannelInfo(const ChannelInfo& info); /* 获取频率信息 */ ChannelInfo& getChannelInfo() { return m_channelInfo; } /* 添加一项,这里的一项是开机和关机单独的一个时间 */ void addPlanItem(const PlanInfo& info); /* 删除一项 */ void deletePlanItem(const enum_WeekDay weekDay, const QDateTime& time, const enum_OnOff onOff); /* 删除一项,传入行号 */ PlanInfo deletePlanItem(const int row); /* 修改一项 */ PlanInfo modifyPlanItem(const int row, const PlanInfo& info); /* 清空列表 */ void clearPlanItem(); /* 取出所有的计划信息,用于给WebAPI发送数据 */ void getAllPlanInfo(QList& list); /* 设置计划列表 */ void setPlanList(const QList& list); /* 获取计划列表,适用于PlanCard之间传输数据 */ void getPlanList(QList& list); /* 设置计划列表,适用于PlanCard之间传输数据 */ void setPlanList(const QList& list); /* 获取选中的行 */ int getSelectedRow() const; PlanInfo getSelectedPlan(); /* 获取计划是否为空 */ bool isPlanEmpty() const { return m_isSpace; } /* 设置自身被选中 */ void setSelected(bool isSelected); /* 自身被点击了,给外部调用,发送点击信号 */ void clickedCard(); signals: /* 点击了一个单元格 */ void signal_clickedItem(PlanInfo& info); /* Card被点击了 */ void signal_clickedCard(int channelID); private slots: /* 更改UI外观 */ void do_setUIStyle(); /* 点击了一个单元格,设置高亮一行 */ void do_tableView_clicked(const QModelIndex& index); private: /* 设置空白图片和文字的位置 */ void setSpaceImageAndTextRect(); /* 根据日期获取字符串 */ QString getDateString(const enum_WeekDay weekDay, const QDateTime& time); /* 设置表格大小 */ void setTableViewSize(); protected: /* 绘制事件 */ void paintEvent(QPaintEvent *event) override; /* 大小缩放事件 */ void resizeEvent(QResizeEvent *event) override; /* 显示事件 */ void showEvent(QShowEvent *event) override; /* 鼠标点击事件 */ void mousePressEvent(QMouseEvent *event) override; /* 事件过滤器 */ bool eventFilter(QObject *watched, QEvent *event) override; private: Ui::PlanCard *ui; ChannelInfo m_channelInfo; /* 频率信息 */ QStandardItemModel* m_model; /* 表格模型,存储数据 */ CSortModel* m_sortModel; /* 排序模型 */ bool m_isSpace = true; /* 计划是否为空 */ QRect m_rectSpaceImage; /* 空白图片的矩形区域 */ QRect m_rectSpaceText; /* 空白文字的矩形区域 */ QPixmap m_spaceImage; /* 空白图片 */ }; #endif // PLANCARD_H