plancard.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #ifndef PLANCARD_H
  2. #define PLANCARD_H
  3. #include <QWidget>
  4. #include <QStandardItemModel>
  5. #include <QSortFilterProxyModel>
  6. #include "TransmitterSwitchInfo.h"
  7. namespace Ui {
  8. class PlanCard;
  9. }
  10. /**
  11. * @brief 用户枚举值
  12. *
  13. */
  14. enum QtUserRole
  15. {
  16. UserRole_WeekDay = Qt::UserRole + 1, /* 周几 */
  17. UserRole_Time, /* 时间 */
  18. UserRole_OnOff /* 开关机 */
  19. };
  20. /**
  21. * @brief 计划信息结构体
  22. *
  23. */
  24. struct PlanInfo
  25. {
  26. bool isNextWeek = false; /* 关机计划时间是否是下周的计划 */
  27. enum_WeekDay onWeekDay; /* 周几 */
  28. QDateTime onDateTime; /* 时间 */
  29. enum_WeekDay offWeekDay; /* 周几 */
  30. QDateTime offDateTime; /* 时间 */
  31. PlanInfo();
  32. PlanInfo(const PlanInfo& info);
  33. PlanInfo& operator=(const PlanInfo& info);
  34. bool operator==(const PlanInfo& info) const;
  35. };
  36. /**
  37. * @brief 自定义排序类
  38. *
  39. */
  40. class CSortModel : public QSortFilterProxyModel
  41. {
  42. Q_OBJECT
  43. public:
  44. explicit CSortModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {}
  45. ~CSortModel() {}
  46. protected:
  47. /* 重载比较函数 */
  48. bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;
  49. };
  50. class PlanCard : public QWidget
  51. {
  52. Q_OBJECT
  53. public:
  54. explicit PlanCard(QWidget *parent = nullptr);
  55. ~PlanCard();
  56. /* 设置频率信息 */
  57. void setChannelInfo(const ChannelInfo& info);
  58. /* 获取频率信息 */
  59. ChannelInfo& getChannelInfo() { return m_channelInfo; }
  60. /* 添加一项,这里的一项是开机和关机单独的一个时间 */
  61. void addPlanItem(const PlanInfo& info);
  62. /* 删除一项 */
  63. void deletePlanItem(const enum_WeekDay weekDay, const QDateTime& time, const enum_OnOff onOff);
  64. /* 删除一项,传入行号 */
  65. PlanInfo deletePlanItem(const int row);
  66. /* 修改一项 */
  67. PlanInfo modifyPlanItem(const int row, const PlanInfo& info);
  68. /* 清空列表 */
  69. void clearPlanItem();
  70. /* 取出所有的计划信息,用于给WebAPI发送数据 */
  71. void getAllPlanInfo(QList<OnePlanItemInfo>& list);
  72. /* 设置计划列表 */
  73. void setPlanList(const QList<OnePlanItemInfo>& list);
  74. /* 获取计划列表,适用于PlanCard之间传输数据 */
  75. void getPlanList(QList<PlanInfo>& list);
  76. /* 设置计划列表,适用于PlanCard之间传输数据 */
  77. void setPlanList(const QList<PlanInfo>& list);
  78. /* 获取选中的行,真实的行,即选中模型中的行 */
  79. int getSelectedRow() const;
  80. /* 获取选中的计划,是真实的计划 */
  81. PlanInfo getSelectedPlan();
  82. /* 取消所有的行选中 */
  83. void cancelAllSelectedRow();
  84. /* 获取计划是否为空 */
  85. bool isPlanEmpty() const { return m_isSpace; }
  86. /* 设置自身被选中 */
  87. void setSelected(bool isSelected);
  88. /* 自身被点击了,给外部调用,发送点击信号 */
  89. void clickedCard();
  90. signals:
  91. /* 点击了一个单元格 */
  92. void signal_clickedItem(PlanInfo& info);
  93. /* Card被点击了 */
  94. void signal_clickedCard(int channelID);
  95. private slots:
  96. /* 更改UI外观 */
  97. void do_setUIStyle();
  98. /* 点击了一个单元格,设置高亮一行 */
  99. void do_tableView_clicked(const QModelIndex& index);
  100. private:
  101. /* 设置空白图片和文字的位置 */
  102. void setSpaceImageAndTextRect();
  103. /* 根据日期获取字符串 */
  104. QString getDateString(const enum_WeekDay weekDay, const QDateTime& time);
  105. /* 设置表格大小 */
  106. void setTableViewSize();
  107. protected:
  108. /* 绘制事件 */
  109. void paintEvent(QPaintEvent *event) override;
  110. /* 大小缩放事件 */
  111. void resizeEvent(QResizeEvent *event) override;
  112. /* 显示事件 */
  113. void showEvent(QShowEvent *event) override;
  114. /* 鼠标点击事件 */
  115. void mousePressEvent(QMouseEvent *event) override;
  116. /* 事件过滤器 */
  117. bool eventFilter(QObject *watched, QEvent *event) override;
  118. private:
  119. Ui::PlanCard *ui;
  120. ChannelInfo m_channelInfo; /* 频率信息 */
  121. QStandardItemModel* m_model; /* 表格模型,存储数据 */
  122. CSortModel* m_sortModel; /* 排序模型 */
  123. bool m_isSpace = true; /* 计划是否为空 */
  124. QRect m_rectSpaceImage; /* 空白图片的矩形区域 */
  125. QRect m_rectSpaceText; /* 空白文字的矩形区域 */
  126. QPixmap m_spaceImage; /* 空白图片 */
  127. };
  128. #endif // PLANCARD_H