plancard.h 4.4 KB

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